从列表中获取唯一的元组

Getting unique tuples from a list

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

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

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

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

我的列表由数百万个这样的元组组成,如何才能有效地实现这一点?

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

给定顺序无关紧要,只需转换为 setfrozenset,这似乎比 listtuple 更适合数据结构,例如:

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