获取唯一的多组列表

tsi*_*nyx 8 python collections combinations unique multiset

如何在Python中统一以下列表:

all_the_ways = [(5,), (2, 2, 1), (2, 1, 2), (2, 1, 1, 1), (1, 2, 2),\
                (1, 2, 1, 1), (1, 1, 2, 1), (1, 1, 1, 2), (1, 1, 1, 1, 1)]
Run Code Online (Sandbox Code Playgroud)

期望的输出是:

[(5,), (2, 2, 1), (2, 1, 1, 1), (1, 1, 1, 1, 1)]
Run Code Online (Sandbox Code Playgroud)

即我需要摆脱具有相同数字但不同顺序的元组.

我试过了

set(all_the_ways)
Run Code Online (Sandbox Code Playgroud)

但它只转置元素.

而当我这样做

list(map(set, all_the_ways))
Run Code Online (Sandbox Code Playgroud)

事情变得更糟:

[{5}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1}]
Run Code Online (Sandbox Code Playgroud)

换句话说,我需要将内部元组转换为允许多个相等项(不适合)集合,set并且元素的排列不会改变集合本身(有点像C++的multiset)

YS-*_*S-L 5

这个怎么样:

list(set(tuple(sorted(s)) for s in all_the_ways))
Run Code Online (Sandbox Code Playgroud)

输出:

[(1, 2, 2), (5,), (1, 1, 1, 1, 1), (1, 1, 1, 2)]
Run Code Online (Sandbox Code Playgroud)

它会破坏每个元组的顺序.我认为这无关紧要,因为包含相同数字集的元组在您的情况下被认为是相同的.这意味着,最后,输出列表可能包含不在原始输入中的元组,例如(归功于@thefourtheye):

all_the_ways = [(2, 1, 2), (2, 2, 1)]
# Output: [(1, 2, 2)]
Run Code Online (Sandbox Code Playgroud)

这可能是也可能不是问题,如果是,您可以使用其他优秀答案中已经提到的更强大的解决方案.