2015-03-13 4 views
0

Я пытаюсь извлечь все уникальные комбинации строк из списка списков в Python. Например, в приведенном ниже коде ['a', 'b', 'c'] и ['b', 'a', 'c'] не являются уникальными, а ['a', 'b', ' c '] и [' a ',' e ',' f '] или [' a ',' b ',' c '] и [' d ',' e ',' f '] уникальны.Извлечение уникальных комбинаций строк из списка списка в Python

Я попытался преобразовать свой список списков в список кортежей и использовать наборы для сравнения элементов, но все элементы все еще возвращаются.

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')]) 

ответ

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}) 

EDIT: Я не уверен, если я правильно понять ваш вопрос. Вы можете использовать счетчик для подсчета событий или использовать набор, если вас интересуют только результирующие наборы элементов, а не их уникальность.

Что-то вроде:

combos = set(tuple(sorted(item)) for item in combos) 

Просто возвращает

set([('a', 'b', 'c'), ('d', 'e', 'f'), ('b', 'c', 'f')]) 
+0

Спасибо! Да, должно было подумать, чтобы отсортировать, прежде чем я сравнил. – Bryan

1
>>> set(tuple(set(combo)) for combo in combos) 
{('a', 'c', 'b'), ('c', 'b', 'f'), ('e', 'd', 'f')} 

Простой, но если у нас есть одинаковые элементы в комбо, он возвращает неправильный ответ. Затем сортировка - это путь, который предлагается в других.

+1

Здесь вы можете сохранить пару байтов: 'set (frozenset (combo) для комбо в комбо)' – georg

+0

@georg right, спасибо за указание! –

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])] 
Смежные вопросы