我有以下 python 列表
data = [1, 2, 2, 2, 3, 4, 7, 8]
现在我想对其进行分区,使连续或重复的项目在同一组中。
所以这应该分为两个列表:
[1, 2, 2, 2, 3, 4] and [7, 8]
尝试了 itertools 和 group by 但遇到重复数字的问题。
for k, g in groupby(enumerate(data), lambda ix: ix[1] - ix[0] <=1):
print(list(map(itemgetter(1), g)))
试试这个:
data = [1, 2, 2, 3, 4, 7, 8]
groups = []
current_group = []
for i, x in enumerate(data):
if i == 0 or x == data[i-1] or x == data[i-1]+1:
current_group.append(x)
else:
groups.append(current_group)
current_group = [x]
groups.append(current_group)
print(groups)
我认为你可以通过迭代列表中的项目来获得你想要的东西,而不需要额外的库。
data_in = [1, 2, 2, 2, 3, 4, 7, 8]
prior = data_in[0]
data_out = [[prior]]
for item in data_in[1:]:
if item in [prior, prior+1]:
data_out[-1].append(item)
else:
data_out.append([item])
prior = item
print(data_out)
那会给你:
[
[1, 2, 2, 2, 3, 4],
[7, 8]
]
除非你真的想找到极简代码,否则你可以这样做:
mylist = [1,23,2,2,3,4,7,8,9,11,12,13,20,21,22]
listlist = []
mylist.sort()
sub_list = [mylist[0]]
for i,num in enumerate(mylist[1:]):
print(num, i)
if num - mylist[i] == 1:
sub_list.append(num)
else:
listlist.append(sub_list)
sub_list = [num]
listlist.append(sub_list)
for sub_l in listlist:
print(sub_l)
一个相当简单的理解方法:
from itertools import pairwise
data_in = [1, 2, 2, 3, 4, 7, 8]
indices = (index + 1 for index, a, b in enumerate(pairwise(data_in)) if b > a + 1)
data_out = [data_in[a:b] for a, b in pairwise([None, *indices, None])]
>>> [[1, 2, 2, 3, 4], [7, 8]]
将最终结果构建为切片的好处,而不是附加每个元素。
使用一个 groupby 对重复元素进行分组,然后使用另一个对连续的组进行分组(和链接):
from itertools import groupby, chain
from operator import itemgetter as ig
data = [1, 2, 2, 2, 3, 4, 7, 8]
for _, G in groupby(enumerate(groupby(data)), lambda x: x[0] - x[1][0]):
print(list(chain.from_iterable(map(ig(1), map(ig(1), G)))))
输出(在线尝试!):
[1, 2, 2, 2, 3, 4]
[7, 8]