Formatting consecutive numbers(格式化连续数字)
问题描述
我正在尝试使用 Python 格式化整数列表,但在实现我想要的结果时遇到了一些困难.
I'm trying to format a list of integers with Python and I'm having a few difficulties achieving what I'd like.
输入是整数的排序列表:
Input is a sorted list of Integers:
list = [1, 2, 3, 6, 8, 9]
我希望它的输出是这样的字符串:
I would like it the output to be a String looking like this:
outputString = "1-3, 6, 8-9"
到目前为止,我设法实现的是:
So far all I managed to achieve is this:
outputString = "1-2-3, 6, 8-9"
如果 Int 已经是连续的,我很难告诉我的代码忽略它.
I'm having trouble to tell my code to ignore a Int if it was already consecutive.
到目前为止,这是我的代码:
Here is my code so far:
def format(l):
i = 0
outputString = str(l[i])
for x in range(len(l)-1):
if l[i + 1] == l[i]+1 :
outputString += '-' + str(l[i+1])
else :
outputString += ', ' + str(l[i+1])
i = i + 1
return outputString
感谢您的帮助和见解:)
Thanks for your help and insights :)
推荐答案
你可以像这样使用 itertools
模块中的 groupby
和 count
:
You can use groupby
and count
from itertools
module like this way:
感谢 @asongtoruin
评论.要从输入中删除重复项,您可以使用:sorted(set(a))
.
Thanks to @asongtoruin
comment. For removing duplicates from the input you can use: sorted(set(a))
.
from itertools import groupby, count
a = [1, 2, 3, 6, 8, 9]
clustered = [list(v) for _,v in groupby(sorted(a), lambda n, c = count(): n-next(c))]
for k in clustered:
if len(k) > 1:
print("{0}-{1}".format(k[0], k[-1]))
else:
print("{0}".format(k[0]))
输出:
1-3
6
8-9
或者你可以做这样的事情来获得漂亮的输出:
Or maybe you can do something like this in order to have a pretty output:
from itertools import groupby, count
a = [1, 2, 3, 6, 8, 9]
clustered = [list(v) for _,v in groupby(sorted(a), lambda n, c = count(): n-next(c))]
out = ", ".join(["{0}-{1}".format(k[0], k[-1]) if len(k) > 1 else "{0}".format(k[0]) for k in clustered ])
print(out)
输出:
1-3, 6, 8-9
更新:
我猜,使用 itertools 模块可能会让许多 Python
的新开发人员感到困惑.这就是为什么我决定重写相同的解决方案而不导入任何包并尝试显示 groupby
和 count
在幕后所做的事情:
I'm guessing, using itertools modules may confuse many Python
's new developers. This is why i decided to rewrite the same solution without importing any package and trying to show what groupby
and count
are doing behind the scenes:
def count(n=0, step=1):
"""Return an infinite generator of numbers"""
while True:
n += step
yield n
def concat(lst):
"""Group lst elements based on the result of elm - next(_count)"""
_count, out = count(), {}
for elm in sorted(lst):
c = elm - next(_count)
if c in out:
out[c].append(elm)
else:
out[c] = [elm]
return out
def pretty_format(dct):
for _, value in dct.items():
if len(value) > 1:
yield '{}-{}'.format(value[0], value[-1])
else:
yield '{}'.format(value[0])
lst = [1, 2, 3, 6, 8, 9]
dct = concat(lst)
formatted = list(pretty_format(dct))
print(formatted)
输出:
['1-3', '6', '8-9']
这篇关于格式化连续数字的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:格式化连续数字
基础教程推荐
- Dask.array.套用_沿_轴:由于额外的元素([1]),使用dask.array的每一行作为另一个函数的输入失败 2022-01-01
- 筛选NumPy数组 2022-01-01
- 使用PyInstaller后在Windows中打开可执行文件时出错 2022-01-01
- 线程时出现 msgbox 错误,GUI 块 2022-01-01
- 用于分类数据的跳跃记号标签 2022-01-01
- 何时使用 os.name、sys.platform 或 platform.system? 2022-01-01
- 如何在海运重新绘制中自定义标题和y标签 2022-01-01
- 如何让 python 脚本监听来自另一个脚本的输入 2022-01-01
- 在 Python 中,如果我在一个“with"中返回.块,文件还会关闭吗? 2022-01-01
- Python kivy 入口点 inflateRest2 无法定位 libpng16-16.dll 2022-01-01