【问题标题】:How do I get rid of reversed tuples in a list? [duplicate]如何摆脱列表中的反转元组? [复制]
【发布时间】:2018-11-23 16:17:09
【问题描述】:

例如,假设我有一个列表:

list_ = [(4,5),(5,4),(5,4),(8,10),(10,8),(9,3),(5,4),(10,8),(8,8)]

如何去掉所有反转的元组,剩下的就是:

list_ = [(4,5),(8,10),(9,3),(8,8)] 

?

这是我正在做的一个个人项目,我写了一些检测反转元组并删除它们的东西,但只删除了一个反转元组(而不是全部)。我认为字典在这里会很有用,但不知道如何实现它

【问题讨论】:

  • 如何决定是否保留(4,5)或(5,4)?
  • 嗯,这取决于。所以你想在第一个槽中保留低值的元组吗?像(4,4) 这样的元组呢?

标签: python list dictionary tuples


【解决方案1】:

我会写一个很好的老式for 循环。该解决方案保证以下几点:保留所有反转元组中的第一个,输出列表与输入的顺序相同,不对输入元组长度做任何假设。

list_ = [(4,5),(5,4),(5,4),(8,10),(10,8),(9,3),(5,4),(10,8),(8,8)]

output, seen = [], set()
for item in list_:
    t1 = tuple(item)
    if t1 not in seen and tuple(reversed(item)) not in seen:
        seen.add(t1)
        output.append(item)

print(output)
# [(4, 5), (8, 10), (9, 3), (8, 8)]

【讨论】:

  • 像这样正确显示手头算法的基于循环的方法在 SO 中的代表性不足,并且尽管对学习者非常有用,但经常迷失在花哨的单行代码中。有一个记录!
【解决方案2】:

长度为 2 的元组

对于长度为 2 的元组,您可以将 frozenset 与文档中提供的 itertools unique_everseen recipe 一起使用,more_itertoolstoolz 3rd 方库中也有介绍:

from more_itertools import unique_everseen

list_ = [(4,5),(5,4),(5,4),(8,10),(10,8),(9,3),(5,4),(10,8),(8,8)]

res = list(unique_everseen(list_, key=frozenset))

[(4, 5), (8, 10), (9, 3), (8, 8)]

frozenset 是一个无序但可散列的唯一项集合。该解决方案假定您的输入都具有长度 2。因此它不会区分 (8,)(8, 8)

可变长度的元组

对于不同长度的元组,可以对recipe做一点小调整:

def unique_everseen_custom(it):
    seen = set()
    seen_add = seen.add
    for tup in it:
        if (tup not in seen) and (tup[::-1] not in seen):
            seen_add(tup)
            yield tup
        
res = list(unique_everseen_custom(list_))

【讨论】:

  • @Chris_Rands,谢谢,我添加了免责声明。目前尚不清楚单例元组情况是否相关(很可能是相关的,在这种情况下 tuple + sorted 有效)。
  • 我误导了你,对不起,>2 元素元组的排序也是错误的,例如(1,2,3) 和 (1,3,2) 不是回文
  • @Chris_Rands,是的,重新阅读问题,你是对的,你可以简单地调整食谱,我相信,已经相应更新。你的解决方案也很好。
【解决方案3】:

如果我们认为您的所有元组都是 duplets 并且您希望保留唯一值:

list_ = [(4,5),(5,4),(5,4),(8,10),(10,8),(3,9),(5,4)]

然后我们对元组进行排序:

list_ = [tuple(sorted(t)) for t in list_]

然后使用一个集合去除重复:

list_ = list(set(list_))

【讨论】:

  • 您在对list_进行排序时缺少[
  • 如果列表中有另一个元组,例如(6,5),该怎么办?
  • 感谢拼写错误通知 ([) 和排序,忘记那个了。
  • 现在你会发现TypeError: unhashable type: 'list'
  • 可能更大的问题是您没有保留元组或整个列表的顺序
猜你喜欢
  • 2023-04-03
  • 2017-12-31
  • 1970-01-01
  • 1970-01-01
  • 2020-10-29
  • 2015-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多