我有一个元组列表,其元素如下:
aa = [('a', 'b'), ('c', 'd'), ('b', 'a')]
我想将('a', 'b') and ('b', 'a')
视为同一个组,并且只想提取唯一的元组。所以输出应该是这样的:
[('a', 'b'), ('c', 'd')]
如何有效地实现这一点,因为我的列表包含数百万个这样的元组?
答案 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)
鉴于订单无关紧要,只需转换为set
和frozenset
,这似乎比list
和tuple
更适合数据结构,例如:
>>> {frozenset(x) for x in aa}
{frozenset({'c', 'd'}), frozenset({'a', 'b'})}