Список уникальных предметов в списке кортежей - PullRequest
3 голосов
/ 29 сентября 2011

У меня есть список таких кортежей: mylist = [(1,2,3),(6,1,1),(7,8,1),(3,4,5)]. Если бы я использовал список понимания slist = [item for sublist in mylist for item in sublist], я мог бы получить slist = [1,2,3,6,1,1,7,8,1,3,4,5].

Как мне изменить, если мне нужны только уникальные элементы в slist, как это [1,2,3,6,7,8,4,5]?

Ответы [ 4 ]

9 голосов
/ 29 сентября 2011

Используйте набор вместо списка.

set(slist)

Если вам действительно нужен список, вы можете преобразовать его обратно в список:

slist = list(set(slist))

Обратите внимание, что это преобразование не сохранит первоначальный порядок элементов.Если вам нужен тот же заказ, вы можете использовать его вместо:

>>> result = []
>>> seen = set()
>>> for innerlist in mylist:
        for item in innerlist:
            if not item in seen:
                seen.add(item)
                result.append(item)
>>> result
[1, 2, 3, 6, 7, 8, 4, 5]
4 голосов
/ 29 сентября 2011

На самом деле вы можете сделать вашу первую часть немного проще, используя itertools.chain.from_iterable и затем передавая результат в set , который будет сохранять только уникальные элементы:

>>> mylist = [(1,2,3),(6,1,1),(7,8,1),(3,4,5)]
>>> import itertools
>>> set(itertools.chain.from_iterable(mylist))
set([1, 2, 3, 4, 5, 6, 7, 8])
2 голосов
/ 29 сентября 2011
import itertools
chain = itertools.chain(*mylist)
print(set(chain))

взято из Уплощение мелкого списка в Python и адаптировано для использования в этом вопросе.

1 голос
/ 29 сентября 2011

Вы должны использовать наборы Python http://docs.python.org/library/sets.html

set(yourlist)

это сделает трюк

...