【问题标题】:Count Amount of duplicate Sublists in list with Python使用 Python 计算列表中重复子列表的数量
【发布时间】:2021-12-06 19:43:43
【问题描述】:

我已经研究了很长时间,但似乎无法找到正确的方法。 我有一个由 113287 个子列表组成的列表,每个子列表包含 2 个整数,每个整数有 2-3 个数字。

list = [[123, 456], [111, 111], [222, 222], [333, 333], [123, 456], [222, 222], [123, 456]]

现在我想计算多次存在的子列表的数量。 不是总体重复的数量,索引也无关紧要,我只想知道哪些值组合存在多次。

示例的结果应该是“2”,因为只有子列表“[222, 222]”和“[123, 456]”存在不止一次。

如果可能并且只有在不使事情过于复杂的情况下,我想在没有外部库的情况下这样做。

我似乎无法弄清楚,感谢任何帮助。

【问题讨论】:

  • 你的尝试在哪里,for循环还是什么?列表是一个错误的变量名称,如您所见,它是彩色的
  • 您想将 [123,456] 和 [456,123] 分别算作两个还是一个?

标签: python python-3.x list


【解决方案1】:

使用collections.Counter 对元素进行计数,然后循环遍历结果以仅保留那些计数大于1 的元素,以及sum

my_list = [[123, 456], [111, 111], [222, 222], [333, 333],
           [123, 456], [222, 222], [123, 456]]

from collections import Counter

c = Counter(map(tuple, my_list))
number = sum(v>1 for v in c.values())

输出:2

注意。您需要将子列表转换为元组,以便它们可以散列并按Counter

【讨论】:

  • 天哪,就是这样。我用 Counter 尝试了很多次,但是有诸如 Counter 独立计算值之类的东西,忽略了我将它们按 touple 分组,例如“sum(y for y in Counter(tuple(x) for x in list.values() if y > 1)" 和许多其他变体.. 我想我得再多学习一下 Counter 才能找出我的思想过程失败的地方。非常感谢!
  • @mhopfner,您似乎接受了这个作为答案,请确保单击“复选标记”(靠近评级)以接受答案。干杯!
【解决方案2】:

您可以遍历列表中的set。但是因为列表是不可散列的,所以您需要将lst 中的每个列表转换为一个元组。然后简单统计lst中的每个列表出现在lst中的次数:

lst = [[123, 456], [111, 111], [222, 222], [333, 333], [123, 456], [222, 222], [123, 456]]
out = sum(1 for l in set(map(tuple,lst)) if lst.count(list(l))>1)

输出:

2

此外,如果您想将 [[12,34],[34,12]] 计为 2,然后根据 @mozway 的答案构建,您可以这样做:

for i, l in enumerate(my_list):
    if l[::-1] in my_list[:i]:
        my_list[i] = l[::-1]

c = Counter(map(tuple, my_list))
number = sum(v>1 for v in c.values())

【讨论】:

  • 重复使用count 会导致性能不佳,您需要再次阅读每个现有元素的整个列表。请改用collections.Counter(参见my answer
  • @mozway 你是对的。鉴于 OP 的样本量,您的答案显然更好
【解决方案3】:

您可以制作一个非重复版本的列表,然后计算重复元素的数量:

ls = [[123, 456], [111, 111], [222, 222], [333, 333], [123, 456], [222, 222], [123, 456]]
uni = []
c = 0
for l in ls:
    if not l in uni:
        uni.append(l)

for l in uni:
    if ls.count(l) != 1:
        c+=1

print(c)

输出:2

【讨论】:

    【解决方案4】:

    MY_LIST = [[123, 456], [111, 111], [222, 222], [333, 333], [123, 456], [222, 222], [123, 456]]

    试试这个:

    来自:Removing duplicates from a list of lists

    uniques = []
    for elem in MY_LIST:
        if elem not in uniques:
            uniques.append(elem)
    print(uniques,'\n') 
    
       
    

    然后:

    repeated = {}
    for elem in uniques:
        counter = 0
        for _elem in MY_LIST:
            if elem == _elem:
                counter=counter+1
        if counter > 1:
            repeated[str(elem)] = counter
    
    print('amount of repeated sublists: {}'.format(len(repeated)))
    print(repeated)
    

    输出:

    [[123, 456], [111, 111], [222, 222], [333, 333]] 
    
    amount of repeated sublists: 2
    {'[123, 456]': 3, '[222, 222]': 2}
    

    【讨论】:

      猜你喜欢
      • 2016-03-04
      • 2015-05-14
      • 2018-02-17
      • 2019-02-04
      • 2021-07-16
      • 2018-09-04
      • 2012-09-05
      • 2017-11-28
      • 2019-04-12
      相关资源
      最近更新 更多