在列表中查找连续或重复的项目

问题描述 投票:0回答:5

我有以下 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)))
python
5个回答
1
投票

试试这个:

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)

1
投票

我认为你可以通过迭代列表中的项目来获得你想要的东西,而不需要额外的库。

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]
]

0
投票

除非你真的想找到极简代码,否则你可以这样做:

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)

0
投票

一个相当简单的理解方法:

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]]

将最终结果构建为切片的好处,而不是附加每个元素。


0
投票

使用一个 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]
© www.soinside.com 2019 - 2024. All rights reserved.