【问题标题】:How to remove non-repeated items from a list of tuples? [closed]如何从元组列表中删除不重复的项目? [关闭]
【发布时间】:2022-01-21 08:39:22
【问题描述】:

我有一个元组列表(根据元组的第一个元素排序),我现在想要删除不超过一次出现的项目?我想没有pythonic方法可以做到这一点。顺便说一句,我很欣赏这方面的任何想法。

【问题讨论】:

  • 请在您的问题中添加minimal reproducible example
  • 循环遍历您的列表,对于列表中出现的每个元组计数,如果超过一次,则添加到新列表以保存结果。一旦完成,新列表将包含多次出现的元组。现在您可以转换为设置,然后再转换回列表。
  • 欢迎来到 Stack Overflow。请阅读How to Ask 并注意这不是代码编写服务。您应该先尝试自己解决问题,即使只是trying to find a solution elsewhere or looking elsewhere to try to understand the problem。理想情况下,您最终会得到某种代码,您应该向我们展示这些代码,并清楚地解释为什么以及如何无法解决问题。
  • 按照@RobPy 的建议,处理我的案件的最佳方式。谢谢

标签: python list tuples


【解决方案1】:

您可以使用collections.Counter 查找出现次数,然后只保留多次出现的次数:

from collections import Counter
items = [(1, 2, 3), (1, 2, 3), (2, 3, 4)]
count = Counter(items)
repeated = [key for key, value in count.items() if value > 1]

【讨论】:

  • 稍微调整了一下,它成功了。但是由于我有某种复杂的数据结构,因此我的情况必须使用 for 循环。顺便谢谢
【解决方案2】:

您可以在列表上循环而不需要计算元素:

l = [(1,2), (3,4), (3,4), (3,5), (3,5), (3,5), (5,6), (5,7), (5,8), (5,8)]
i = 0
l2 = []
while i < len(l):
    tmp = l[i]
    found_more_than_once = False
    while i+1 < len(l) and l[i+1] == tmp:
        i += 1
        l2.append(l[i])
        found_more_than_once = True
    if found_more_than_once:
        l2.append(l[i])
    i += 1

print(l2)

【讨论】:

  • 是什么让你认为它是 O(n²)? collections.Counter 在时间上是线性的,列表理解也是如此。顺便说一句,使用for 循环和enumerate 而不是while 和计数器变量会更加pythonic。
  • 我使用 while 循环能够在嵌套循环中的某些条件下增加计数器。关于复杂性,抱歉我没有注意到您使用了collections.Counter
  • 我对其进行了一些分析(列表中的 500 个项目,10,000 次迭代,Counter 版本的运行时间是该版本所需时间的 14%。
  • 虽然我的元组列表已排序,但决定删除 while 循环部分。顺便说一句,我使用了一些硬编码的解决方案作为您的建议。谢谢
猜你喜欢
  • 1970-01-01
  • 2018-05-15
  • 1970-01-01
  • 1970-01-01
  • 2017-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多