У меня есть список списков:
lists = [[1,4,3,2,4], [4,5]]
Я хочу сгладить этот список и удалить все дубликаты; или, другими словами, применить операцию объединения множества:
desired_result = [1, 2, 3, 4, 5]
Как это сделать проще всего?
Ответы:
set.union
делает то, что вы хотите:
>>> results_list = [[1,2,3], [1,2,4]]
>>> results_union = set().union(*results_list)
>>> print(results_union)
set([1, 2, 3, 4])
Вы также можете сделать это с более чем двумя списками.
union()
поддерживает только несколько аргументов для Python версии 2.6 или выше. Похоже, вы использовали более раннюю версию, поэтому вам, вероятно, придется использовать явный цикл: total = set(); for x in results_list: total.update(x)
(s /; / \ n /)
results_union = set.union(*(set(el) for el in results_list))
TypeError: descriptor 'union' requires a 'set' object but received a 'list'
в Python 3.6 по крайней мере.
set.union(*results_list)
вы привязываете дескриптор метода вручную, то есть отправляете первый элемент results_list
как «self». Это накладывает некоторые странные ограничения: 1. не утиный тип должным образом (теперь первый элемент должен быть набором или экземпляром подкласса набора), и 2. объединение пустого results_list
будет ошибкой (неправильный результат - должен вернуть пустой набор).
Поскольку вы, похоже, используете Python 2.5 ( было бы неплохо упомянуть в своем Q, если вам нужен A для версий! = 2.6, кстати, текущий производственный ;-) и вам нужен список, а не набор в качестве Результат, рекомендую:
import itertools
...
return list(set(itertools.chain(*result_list)))
itertools, как правило, является отличным способом работы с итераторами (и, следовательно, со многими видами последовательностей или коллекций), и я настоятельно рекомендую вам ознакомиться с ним. itertools.chain
, в частности, документировано здесь .
itertools
упаковку.
itertools.chain
Кстати, отлично работает и в Python 2.4.
Вы также можете следовать этому стилю
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']
Союзы не поддерживаются списками, которые упорядочены, но поддерживаются наборами. Проверьте set.union .
Я использовал следующее, чтобы сделать пересечения, что избавляет от необходимости в наборах.
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 ]