我有一个包含随机数量的整数的列表。 我想迭代这个列表,如果一个数字和连续数字在一个数字步骤之内,我想将它们连接成一个子列表。
例如:
input = [1,2,4,6,7,8,10,11]
output = [[1,2],[4],[6,7,8],[10,11]]
输入列表将始终包含按升序排序的正整数。 我尝试了here中的一些代码。
initerator = iter(inputList)
outputList = [c + next(initerator, "") for c in initerator]
虽然我可以连接列表中的每两个条目,但我似乎无法在列表推导中添加合适的if
。
Python版本= 3.4
答案 0 :(得分:0)
很好的方式(找到“拆分”指数然后切片:
input = [1,2,4,6,7,8,10,11]
idx = [0] + [i+1 for i,(x,y) in enumerate(zip(input,input[1:])) if x+1!=y] + [len(input)]
[ input[u:v] for u,v in zip(idx, idx[1:]) ]
#output:
[[1, 2], [4], [6, 7, 8], [10, 11]]
使用enumerate()和zip()。
答案 1 :(得分:0)
除非你必须有一个单行,你可以使用一个简单的生成器函数,组合元素,直到你遇到一个非连续的元素:
def consec(lst):
it = iter(lst)
prev = next(it)
tmp = [prev]
for ele in it:
if prev + 1 != ele:
yield tmp
tmp = [ele]
else:
tmp.append(ele)
prev = ele
yield tmp
输出:
In [2]: lst = [1, 2, 4, 6, 7, 8, 10, 11]
In [3]: list(consec(lst))
Out[3]: [[1, 2], [4], [6, 7, 8], [10, 11]]
答案 2 :(得分:0)
最简单的版本我没有任何导入:
def mergeAdjNum(l):
r = [[l[0]]]
for e in l[1:]:
if r[-1][-1] == e - 1:
r[-1].append(e)
else:
r.append([e])
return r
比一个衬垫快约33%。
这个处理注释中提到的字符前缀分组:
def groupPrefStr(l):
pattern = re.compile(r'([a-z]+)([0-9]+)')
r = [[l[0]]]
pp, vv = re.match(pattern, l[0]).groups()
vv = int(vv)
for e in l[1:]:
p,v = re.match(pattern, e).groups()
v = int(v)
if p == pp and v == vv + 1:
r[-1].append(e)
else:
pp, vv = p, v
r.append([e])
return r
这比只有一个数字要慢。知道前缀的确切格式(只有一个char?)可以帮助避免使用re模块并加快速度。