Mam listę list:
lists = [[1,4,3,2,4], [4,5]]
Chcę spłaszczyć tę listę i usunąć wszystkie duplikaty; lub, innymi słowy, zastosuj operację set union:
desired_result = [1, 2, 3, 4, 5]
Jaki jest najłatwiejszy sposób na zrobienie tego?
Odpowiedzi:
set.union
robi co chcesz:
>>> results_list = [[1,2,3], [1,2,4]]
>>> results_union = set().union(*results_list)
>>> print(results_union)
set([1, 2, 3, 4])
Możesz to również zrobić z więcej niż dwoma listami.
union()
obsługuje tylko wiele argumentów dla Pythona w wersji 2.6 lub nowszej. Wydaje się, że używasz wcześniejszej wersji, więc prawdopodobnie musisz użyć jawnej pętli: 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'
w Pythonie 3.6 co najmniej.
set.union(*results_list)
, wiążesz deskryptor metody ręcznie, tj. Wysyłasz pierwszy element results_list
jako „self”. Stwarza to pewne dziwne ograniczenia: 1. nie jest poprawnie typem duck (teraz pierwszy element musi być zestawem lub instancją podklasy set), oraz 2. suma pustego results_list
będzie błędem (niepoprawny wynik - powinien zwrócić pusty zestaw).
Ponieważ wydaje się, że używasz Pythona 2.5 ( byłoby miło wspomnieć w swoim Q, jeśli potrzebujesz A dla wersji! = 2.6, przy okazji bieżącej wersji produkcyjnej ;-) i chcesz raczej listę niż zestaw jako wynik, polecam:
import itertools
...
return list(set(itertools.chain(*result_list)))
itertools to ogólnie świetny sposób pracy z iteratorami (a więc z wieloma rodzajami sekwencji lub kolekcji) i serdecznie polecam zapoznanie się z nim. itertools.chain
w szczególności jest udokumentowana tutaj .
itertools
opakowaniu.
itertools.chain
Nawiasem mówiąc, działa dobrze również w Pythonie 2.4.
Możesz również podążać za tym stylem
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']
Użyłem poniższego, aby wykonać przecięcia, co pozwala uniknąć zestawów.
a, b= [[1,2,3], [1,2]]
s = filter( lambda x: x in b, a)
lub,
s = [ x for x in b if x in a ]