从列表中获取唯一元组

时间:2017-08-18 11:54:38

标签: python python-2.7 set unique

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

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

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

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

如何有效地实现这一点,因为我的列表包含数百万个这样的元组?

2 个答案:

答案 0 :(得分:7)

转换为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'})}

答案 1 :(得分:0)

鉴于订单无关紧要,只需转换为setfrozenset,这似乎比listtuple更适合数据结构,例如:

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