У мене є список списків:
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'
на пітоні 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 ]