【问题标题】:How should I get a list of duplicate sublists in a list?我应该如何获取列表中重复子列表的列表?
【发布时间】:2016-03-12 08:05:57
【问题描述】:

我正在尝试创建允许我获取列表的唯一子列表列表的函数。这些函数适用于某些列表列表,但不适用于其他列表,我不知道为什么。

获取重复子列表的索引然后构建它们的列表的有效、可靠的方法是什么?

以下最小的工作示例说明了该功能。找到列表 a 的重复项,但发现列表 b 的重复项不正确。

def indices_of_list_element_duplicates(x):
    seen = set()
    for index, element in enumerate(x):
        if isinstance(element, list):
            element = tuple(element)
        if element not in seen:
            seen.add(element)
        else:
            yield index

def list_element_duplicates(x):
    indices = list(indices_of_list_element_duplicates(x))
    return [x[index] for index in indices]

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

print(list_element_duplicates(a))

print("--------------------------------------------------------------------------------")

b = [[10], [15], [20], [10, 10], [10, 15], [10, 20], [15, 10], [15, 15], [15, 20], [20, 10], [20, 15], [20, 20], [10, 10, 10], [10, 10, 15], [10, 10, 20], [10, 15, 10], [10, 15, 15], [10, 15, 20], [10, 20, 10], [10, 20, 15], [10, 20, 20], [15, 10, 10], [15, 10, 15], [15, 10, 20], [15, 15, 10], [15, 15, 15], [15, 15, 20], [15, 20, 10], [15, 20, 15], [15, 20, 20], [20, 10, 10], [20, 10, 15], [20, 10, 20], [20, 15, 10], [20, 15, 15], [20, 15, 20], [20, 20, 10], [20, 20, 15], [20, 20, 20], [10], [15], [20], [10, 10], [10, 15], [10, 20], [15, 10], [15, 15], [15, 20], [20, 10], [20, 15], [20, 20], [10, 10, 10], [10, 10, 15], [10, 10, 20], [10, 15, 10], [10, 15, 15], [10, 15, 20], [10, 20, 10], [10, 20, 15], [10, 20, 20], [15, 10, 10], [15, 10, 15], [15, 10, 20], [15, 15, 10], [15, 15, 15], [15, 15, 20], [15, 20, 10], [15, 20, 15], [15, 20, 20], [20, 10, 10], [20, 10, 15], [20, 10, 20], [20, 15, 10], [20, 15, 15], [20, 15, 20], [20, 20, 10], [20, 20, 15], [20, 20, 20], [10], [15], [20], [10, 10], [10, 15], [10, 20], [15, 10], [15, 15], [15, 20], [20, 10], [20, 15], [20, 20], [10, 10, 10], [10, 10, 15], [10, 10, 20], [10, 15, 10], [10, 15, 15], [10, 15, 20], [10, 20, 10], [10, 20, 15], [10, 20, 20], [15, 10, 10], [15, 10, 15], [15, 10, 20], [15, 15, 10], [15, 15, 15], [15, 15, 20], [15, 20, 10], [15, 20, 15], [15, 20, 20], [20, 10, 10], [20, 10, 15], [20, 10, 20], [20, 15, 10], [20, 15, 15], [20, 15, 20], [20, 20, 10], [20, 20, 15], [20, 20, 20], [10], [15], [20], [10, 10], [10, 15], [10, 20], [15, 10], [15, 15], [15, 20], [20, 10], [20, 15], [20, 20], [10, 10, 10], [10, 10, 15], [10, 10, 20], [10, 15, 10], [10, 15, 15], [10, 15, 20], [10, 20, 10], [10, 20, 15], [10, 20, 20], [15, 10, 10], [15, 10, 15], [15, 10, 20], [15, 15, 10], [15, 15, 15], [15, 15, 20], [15, 20, 10], [15, 20, 15], [15, 20, 20], [20, 10, 10], [20, 10, 15], [20, 10, 20], [20, 15, 10], [20, 15, 15], [20, 15, 20], [20, 20, 10], [20, 20, 15], [20, 20, 20]]

print(list_element_duplicates(b))

【问题讨论】:

  • 不知道您的预期输入/输出我不太确定,但我觉得更改为 element = tuple(sorted(element)) 可能会对您有所帮助。
  • @PadraicCunningham 为什么你认为它不适用于a[1, 2][5, 2] 不是重复的吗?
  • @d3pd,嗯,好吧,所以你想保持欺骗,你的逻辑仍然不正确

标签: python list duplicates sublist


【解决方案1】:

您可以使用 Counter dict 将子列表映射到元组并获取计数,仅保留计数大于 1 的子列表:

from collections import Counter
a = [[1, 2], [1, 2], [2, 2], [3, 2], [4, 2], [5, 2], [5, 2]]


cn = Counter(map(tuple,a))

print([sub for sub in a if cn[tuple(sub)] > 1])

为混合类型工作并获得独特的回报:

from collections import Counter    

a = [[1, 2], [1, 2], [2, 2], [3, 2], [4, 2], [5, 2], [5, 2], "foo", 123, 123]

def counts(x):
    for ele in x:
        if isinstance(ele, Hashable):
            yield ele
        else:
            yield tuple(ele)


def unique_dupes(x):
    cnts = Counter(counts(x))
    for ele in x:
        t = ele
        if not isinstance(ele, Hashable):
            t = tuple(ele)
        if cnts[t] > 1:
            yield ele
            del cnts[t]

print(list(unique_dupes(a)))

输出:

 [[1, 2], [5, 2], 123]

【讨论】:

  • @Padraic ...如果我错了,请纠正,但我相信 OP 想要重复列表的列表..no?
  • @IronFist,是的,最初读错了,只需将 == 更改为 >
【解决方案2】:

问题一定来自以下几行:

if isinstance(element, list):
    element = tuple(element)
if element not in seen:
    seen.add(element)

如果你已经在seen 中输入了[10,15],然后你想在看到的[15,10] 中检查,它会返回FALSE

解决这个问题的方法是,虽然您认为 [x,y][y,x] 相同,但您可以通过以下方式对您检查的每个元素进行排序:

if isinstance(element, list):
    element = tuple(sorted(element))
if element not in seen:
    seen.add(element)

【讨论】:

    【解决方案3】:

    列表理解很容易

    list_a = [[1, 2], [1, 2], [2, 2], [3, 2], [4, 2], [5, 2], [5, 2]]
    
        unique_list=[]
        duplicate_list=[]
        sorted_list=[sorted(item) for item in list_a]
    
        final_list=[unique_list.append(item) if item not in unique_list else duplicate_list.append(item) for item in sorted_list]
        print(unique_list)
        print(duplicate_list)
    

    【讨论】:

      【解决方案4】:

      Python 列表有一个漂亮的内置函数,称为count。使用这个你可以做到:

      a = [[1, 2], [1, 2], [2, 2], [3, 2], [4, 2], [5, 2], [5, 2]]
      dups = list()
      
      for e in a:
          if a.count(e) > 1:
              dups.append(e)
      

      这将为您提供一个名为 dups 的列表,其中包含 [[1,2],[1,2],[5,2],[5,2]]

      【讨论】:

      • 我的错,帖子已修复...:/
      猜你喜欢
      • 2013-09-15
      • 2020-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-24
      • 2022-07-09
      • 1970-01-01
      • 2017-12-15
      相关资源
      最近更新 更多