Pythonic способ создать объединение всех значений, содержащихся в нескольких списках - PullRequest
59 голосов
/ 28 января 2010

У меня есть список списков:

lists = [[1,4,3,2,4], [4,5]]

Я хочу сгладить этот список и удалить все дубликаты; или, другими словами, примените операцию объединения множеств:

desired_result = [1, 2, 3, 4, 5]

Какой самый простой способ сделать это? (Я вынужден использовать Python 2.4 для этого проекта)

Ответы [ 5 ]

116 голосов
/ 28 января 2010

set.union делает то, что вы хотите:

>>> results_list = [[1,2,3], [1,2,4]]
>>> results_union = set().union(*results_list)
>>> print(results_union)
set([1, 2, 3, 4])

Вы также можете сделать это с более чем двумя списками.

11 голосов
/ 28 января 2010

Поскольку вы, похоже, используете Python 2.5 (было бы неплохо упомянуть в вашем Q , если вам нужна A для версий! = 2.6, кстати, текущая рабочая версия ;-) и Я хочу список, а не набор в результате, я рекомендую:

   import itertools

   ...

   return list(set(itertools.chain(*result_list)))

itertools - это, как правило, отличный способ работы с итераторами (и так со многими видами последовательностей или коллекций), и я искренне рекомендую вам ознакомиться с ним. itertools.chain, в частности, задокументировано здесь .

2 голосов
/ 28 января 2010

Я использовал следующее для пересечений, что избавляет от необходимости наборов.

a, b= [[1,2,3], [1,2]]
s = filter( lambda x: x in b, a)

или

s = [ x for x in b if x in a ]
2 голосов
/ 28 января 2010

Объединения не поддерживаются списками, которые упорядочены, но поддерживаются наборами. Проверьте set.union .

1 голос
/ 01 марта 2016

Вы также можете следовать этому стилю

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