【问题标题】:Getting unique tuples from a list [duplicate]从列表中获取唯一的元组[重复]
【发布时间】:2017-08-18 11:54:37
【问题描述】:

我有一个元组列表,其元素如下:

aa = [('a', 'b'), ('c', 'd'), ('b', 'a')] 

我想将('a', 'b') and ('b', 'a') 视为同一个组,并且只想提取唯一的元组。所以输出应该是这样的:

[('a', 'b'), ('c', 'd')]

由于我的列表包含数百万个这样的元组,我如何才能有效地实现这一目标?

【问题讨论】:

  • 您可以使用setfrozenset,例如{frozenset(x) for x in aa}
  • 那么需要选择这两者中的哪一个?顺序重要吗?
  • 无顺序无所谓
  • @mlRocks:那为什么这些对象是元组呢?您可能希望首先设置集合(frozensetset,不可变或可变)。
  • 是否存在两个值相同的元组,例如('a', 'a')

标签: python python-2.7 set unique


【解决方案1】:

转换为frozenset,散列并检索:

In [193]: map(tuple, set(map(frozenset, aa))) # python2
Out[193]: [('d', 'c'), ('a', 'b')]

这是一个更易读的版本,带有列表理解:

In [194]: [tuple(x) for x in set(map(frozenset, aa))]
Out[194]: [('d', 'c'), ('a', 'b')]

请注意,对于您的特定用例,元组列表并不是数据结构的最佳选择。考虑将您的数据存储为一组开始?

In [477]: set(map(frozenset, aa))
Out[477]: {frozenset({'a', 'b'}), frozenset({'c', 'd'})}

【讨论】:

  • 元组集呢?
  • @mlRocks 考虑到元组是有序且可散列的,这可能是个问题。也许从一组frozensets开始。
  • 感谢您的建议。会记住这一点
【解决方案2】:

考虑到顺序并不重要,只需转换为setfrozenset,这似乎比listtuple 更适合数据结构,例如:

>>> {frozenset(x) for x in aa}
{frozenset({'c', 'd'}), frozenset({'a', 'b'})}

【讨论】:

    猜你喜欢
    • 2013-08-14
    • 2010-11-26
    • 2013-06-12
    • 1970-01-01
    • 2012-10-05
    • 2016-03-06
    • 2020-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多