我正在尝试从Python中的列表列表中提取所有字符串的唯一组合。例如,在下面的代码中,['a','b','c']和['b','a','c']不是唯一的,而['a','b',' c']和['a','e','f']或['a','b','c']和['d','e','f']是唯一的。
我尝试将列表列表转换为元组列表并使用集合来比较元素,但仍然返回所有元素。
combos = [['a', 'b', 'c'], ['c', 'b', 'a'], ['d', 'e', 'f'], ['c', 'a', 'b'], ['c', 'f', 'b']]
# converting list of list to list of tuples, so they can be converted into a set
combos = [tuple(item) for item in combos]
combos = set(combos)
grouping_list = set()
for combination in combos:
if combination not in grouping_list:
grouping_list.add(combination)
##
print grouping_list
>>> set([('a', 'b', 'c'), ('c', 'a', 'b'), ('d', 'e', 'f'), ('c', 'b', 'a'), ('c', 'f', 'b')])
答案 0 :(得分:2)
排序,(和使用计数器)怎么样?
from collections import Counter
combos = [['a', 'b', 'c'], ['c', 'b', 'a'], ['d', 'e', 'f'], ['c', 'a', 'b'], ['c', 'f', 'b']]
combos = Counter(tuple(sorted(item)) for item in combos)
print(combos)
返回:
Counter({('a', 'b', 'c'): 3, ('d', 'e', 'f'): 1, ('b', 'c', 'f'): 1})
编辑:我不确定我是否正确理解你的问题。您可以使用计数器计算出现次数,或者如果您只对结果项目集感兴趣而不是对其唯一性感兴趣,则可以使用集合。
类似的东西:
combos = set(tuple(sorted(item)) for item in combos)
简单地返回
set([('a', 'b', 'c'), ('d', 'e', 'f'), ('b', 'c', 'f')])
答案 1 :(得分:1)
>>> set(tuple(set(combo)) for combo in combos)
{('a', 'c', 'b'), ('c', 'b', 'f'), ('e', 'd', 'f')}
简单但如果我们在组合中有相同的元素,它将返回错误的答案。然后,排序是其他人建议的方式。
答案 2 :(得分:0)
这个怎么样:
combos = [['a', 'b', 'c'], ['c', 'b', 'a'], ['d', 'e', 'f'], ['c', 'a', 'b'], ['c', 'f', 'b']]
print [list(y) for y in set([''.join(sorted(c)) for c in combos])]