2013-07-21 2 views
2

Я пытаюсь напечатать все буквы во всех словах в списке без дубликатов.Python list comprehension: список подпозиций без дубликатов

wordlist = ['cat','dog','rabbit'] 
letterlist = [] 
[[letterlist.append(x) for x in y] for y in wordlist] 

Код выше генерирует ['c', 'a', 't', 'd', 'o', 'g', 'r', 'a', 'b', 'b', 'i', 't'], в то время как я ищу ['c', 'a', 't', 'd', 'o', 'g', 'r', 'b', 'i'].

Как изменить понимание списка, чтобы удалить дубликаты?

+0

так что вы хотите использовать только список? – rnbcoder

+1

Вы можете сделать '[letterlist.append (x) для y в списке слов для x в y, если x не в списке букв]' – karthikr

ответ

2

Если вы хотите изменить вам собственный код:

[[letterlist.append(x) for x in y if x not in letterlist] for y in wordlist] 

или

list(set([[letterlist.append(x) for x in y if x not in letterlist] for y in wordlist])) 

еще:

list(set(''.join(wordlist))) 
0

Вы можете использовать set, чтобы удалить дубликаты, но заказ не поддерживается.

>>> letterlist = list({x for y in wordlist for x in y}) 
>>> letterlist 
['a', 'c', 'b', 'd', 'g', 'i', 'o', 'r', 't'] 
>>> 
0
wordlist = ['cat','dog','rabbit'] 
s = set() 
[[s.add(x) for x in y] for y in wordlist] 
10

Вы заботитесь о поддержании порядка?

>>> wordlist = ['cat','dog','rabbit'] 
>>> set(''.join(wordlist)) 
{'o', 'i', 'g', 'd', 'c', 'b', 'a', 't', 'r'} 
+4

Это может быть записано как 'set(). Union (* wordlist)', который позволяет 'set' позаботьтесь о множественных итерациях и не обязательно присоединяйте их к строке сначала –

3

В то время как все другие ответы не поддерживать порядок, этот код:

from collections import OrderedDict 
letterlist = list(OrderedDict.fromkeys(letterlist)) 

Смотрите также, статью о нескольких направлениях с критериями: Fastest way to uniqify a list in Python.

+0

Этот ответ не работает: '>>> wordlist = list (OrderedDict.fromkeys (wordlist)) >>> wordlist [' cat ',' dog ',' rabbit '] ' – Mingyu

+0

Обратите внимание, что в моем коде используется« буквенный список », а не« список слов », который использует ваш код. –

+0

Тогда это имеет смысл. Спасибо за ваше объяснение :-) – Mingyu

4

два подхода:

Сохраняя заказ:

>>> from itertools import chain 
>>> from collections import OrderedDict 
>>> list(OrderedDict.fromkeys(chain.from_iterable(wordlist))) 
['c', 'a', 't', 'd', 'o', 'g', 'r', 'b', 'i'] 

Если вы не хлопотал о порядке:

>>> list(set().union(*wordlist)) 
['a', 'c', 'b', 'd', 'g', 'i', 'o', 'r', 't'] 

Ни этого используется список-оценочным для побочных эффектов, например, :

[[letterlist.append(x) for x in y] for y in wordlist] 

Строит ли список списков Nones исключительно для мутаций letterlist

Смежные вопросы