如何在 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)]
期望的输出是:
[(5,), (2, 2, 1), (2, 1, 1, 1), (1, 1, 1, 1, 1)]
即我需要摆脱具有相同数字集但顺序不同的元组。
我试过了
set(all_the_ways)
但它只是转置元素。
当我这样做的时候
list(map(set, all_the_ways))
事情只会变得更糟:
[{5}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1}]
换句话说,我需要将内部元组转换为允许多个相等项的集合(set
不适合)并且元素的排列不会改变集合本身(有点像 C++ 的 multiset
)
最佳答案
这个怎么样:
list(set(tuple(sorted(s)) for s in all_the_ways))
输出:
[(1, 2, 2), (5,), (1, 1, 1, 1, 1), (1, 1, 1, 2)]
虽然它会破坏每个元组的顺序。我假设这无关紧要,因为对于您的情况,包含相同数字集的元组被认为是相同的。这意味着最终输出列表可能包含不在原始输入中的元组,例如(感谢@thefourtheye):
all_the_ways = [(2, 1, 2), (2, 2, 1)]
# Output: [(1, 2, 2)]
这可能是也可能不是问题,如果是,您可以使用其他优秀答案中已经提到的更强大的解决方案。
关于python - 获取独特的多集列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23356512/