Maneira pitônica de criar união de todos os valores contidos em várias listas
Pergunta
Eu tenho uma lista de listas:
lists = [[1,4,3,2,4], [4,5]]
Quero achatar esta lista e remover todas as duplicatas; Ou, em outras palavras, aplique uma operação de união definida:
desired_result = [1, 2, 3, 4, 5]
Qual é a maneira mais fácil de fazer isso? (Sou forçado a usar o Python 2.4 para este projeto)
Solução
set.union
faz o que você quer:
>>> results_list = [[1,2,3], [1,2,4]]
>>> results_union = set().union(*results_list)
>>> print(results_union)
set([1, 2, 3, 4])
Você também pode fazer isso com mais de duas listas.
Outras dicas
Já que você parece estar usando o Python 2.5 (ele gostaria Seja bom mencionar em seu q se você precisar de um A para versões! = 2.6, a propósito atual, a propósito ;-) e deseja uma lista em vez de um conjunto como resultado, recomendo:
import itertools
...
return list(set(itertools.chain(*result_list)))
ITERTOOLS Geralmente é uma ótima maneira de trabalhar com iteradores (e, portanto, com muitos tipos de seqüências ou coleções) e eu recomendo que você se familiarize com ele. itertools.chain
, em particular, está documentado aqui.
Os sindicatos não são suportados por listas, que são ordenadas, mas são suportadas por conjuntos. Verificação de saída set.Union.
Usei o seguinte para fazer interseções, o que evita a necessidade de conjuntos.
a, b= [[1,2,3], [1,2]]
s = filter( lambda x: x in b, a)
ou,
s = [ x for x in b if x in a ]
Você também pode seguir este estilo
In [12]: a = ['Orange and Banana', 'Orange Banana']
In [13]: b = ['Grapes', 'Orange Banana']
In [14]: c = ['Foobanana', 'Orange and Banana']
In [20]: list(set(a) | set(b) | set(c))
Out[20]: ['Orange and Banana', 'Foobanana', 'Orange Banana', 'Grapes']
In [21]: list(set(a) & set(b) | set(c))
Out[21]: ['Orange and Banana', 'Foobanana', 'Orange Banana']
desired_result = [x for y in lists for x in y]