【问题标题】:Group repeated elements of a list对列表的重复元素进行分组
【发布时间】:2017-11-15 19:09:53
【问题描述】:

我正在尝试创建一个函数来接收一个列表并返回另一个包含重复元素的列表。

例如对于输入A = [2,2,1,1,3,2](列表未排序),函数将返回result = [[1,1], [2,2,2]]。结果不需要排序。

我已经在 Wolfram Mathematica 中做过,但现在我必须将它翻译成 python3,Mathematica 有一些函数,如 Select、Map 和 Split,这使得它非常简单,无需使用带有大量指令的长循环。

【问题讨论】:

  • 你的列表排序了吗?

标签: python python-3.x list


【解决方案1】:
result = [[x] * A.count(x) for x in set(A) if A.count(x) > 1]

【讨论】:

  • 不错!没想到要使用集合,所以你可以内联完成这一切。你真的不需要最后的条件,没有它会更漂亮
【解决方案2】:

简单的方法:

def grpBySameConsecutiveItem(l):
    rv= []
    last = None
    for elem in l:
        if last == None:
            last = [elem]
            continue
        if elem == last[0]:
            last.append(elem)
            continue
        if len(last) > 1:
            rv.append(last)
        last = [elem]
    return rv


print grpBySameConsecutiveItem([1,2,1,1,1,2,2,3,4,4,4,4,5,4])

输出:

[[1, 1, 1], [2, 2], [4, 4, 4, 4]]

如果你想对你的输出进行排序或对你的 inputlist 进行排序,你可以在之后对输出进行排序,那么你就不会再得到连续的相同数字了。

请参阅https://stackoverflow.com/a/4174955/7505395,了解如何根据索引对列表列表进行排序(只需使用 0),因为所有内部列表都是相同的。

你也可以使用itertools - it hast things like TakeWhile - 如果使用它看起来更聪明

这将忽略连续的,只收集它们:

def grpByValue(lis):
    d = {}
    for key in lis:
        if key in d:
            d[key] += 1
        else:
            d[key] = 1
    print(d)    

    rv = []
    for k in d:
        if (d[k]<2): 
            continue
        rv.append([])
        for n in range(0,d[k]):
            rv[-1].append(k)
    return rv



data = [1,2,1,1,1,2,2,3,4,4,4,4,5,4]

print grpByValue(data) 

输出:

[[1, 1, 1, 1], [2, 2, 2], [4, 4, 4, 4, 4]]

【讨论】:

  • 感谢您的回答,但不是我正在寻找的输出。对于该输入,输出需要是 [[1,1,1,1],[2,2,2], [4,4,4,4]] (不需要排序)。只是在整个列表中重复的元素。
  • @Gabriela:简单的解决方案。首先对您的输入进行排序 - 然后相同的数字将按排序分组,算法给出您的输出(请参阅算法名称了解它的作用:o)。
  • @Gabriela: 2. 实现:将它们统计到字典中,从 dict 创建列表 :) 输出现在应该可以了
【解决方案3】:

你可以通过列表理解来做到这一点:

A = [1,1,1,2,2,3,3,3]
B = []
[B.append([n]*A.count(n)) for n in A if B.count([n]*A.count(n)) == 0]

输出[[1,1,1],[2,2],[3,3,3]]

或者更Python化:

A = [1,2,2,3,4,1,1,2,2,2,3,3,4,4,4]
B = []
for n in A:
    if B.count([n]*A.count(n)) == 0:
        B.append([n]*A.count(n))

输出[[1,1,1],[2,2,2,2,2],[3,3,3],[4,4,4,4]]

适用于已排序或未排序的列表,如果您需要事先对列表进行排序,您可以使用for n in sorted(A)

【讨论】:

    【解决方案4】:

    这是Counter() 的工作。遍历每个元素 x 并检查 A.count(x) 的复杂度为 O(N^2)。 Counter() 将计算每个元素在一次迭代中存在多少次,然后您可以通过迭代该字典来生成结果。

    >>> from collections import Counter
    >>> A = [2,2,1,1,3,2]
    >>> counts = Counter(A)
    >>> result = [[key] * value for key, value in counts.items() if value > 1]
    >>> result
    [[2, 2, 2], [[1, 1]]
    

    【讨论】:

      猜你喜欢
      • 2021-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-13
      • 1970-01-01
      相关资源
      最近更新 更多