从列表中获取唯一元组

mlR*_*cks 5 python unique set python-2.7

我有一个元组列表,其元素是这样的:

aa = [('a', 'b'), ('c', 'd'), ('b', 'a')] 
Run Code Online (Sandbox Code Playgroud)

我想('a', 'b') and ('b', 'a')作为同一组处理,并希望只提取唯一的元组.所以输出应该是这样的:

[('a', 'b'), ('c', 'd')]
Run Code Online (Sandbox Code Playgroud)

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

cs9*_*s95 7

转换为a frozenset,hash和retrieve:

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

这是一个稍微易读的版本,具有列表理解:

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

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

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