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)
这个怎么样:
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)
这可能是也可能不是问题,如果是,您可以使用其他优秀答案中已经提到的更强大的解决方案.