Ich habe eine Liste von Listen:
lists = [[1,4,3,2,4], [4,5]]
Ich möchte diese Liste reduzieren und alle Duplikate entfernen. oder mit anderen Worten, wenden Sie eine festgelegte Vereinigungsoperation an:
desired_result = [1, 2, 3, 4, 5]
Was ist der einfachste Weg, dies zu tun?
union()
nur mehrere Argumente für Python Version 2.6 oder höher unterstützt. Sie scheinen vorher eine Version zu verwenden, daher müssen Sie wahrscheinlich eine explizite Schleife verwenden: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'
in Python 3.6 mindestens.set.union(*results_list)
, binden Sie den Methodendeskriptor manuell, dh senden Sie das erste Elementresults_list
als "self" ein. Dies macht einige seltsame Einschränkungen: 1. Ententyp nicht richtig (jetzt muss das erste Element eine Menge oder Instanz einer Mengenunterklasse sein), und 2. Die Vereinigung eines Leerzeichensresults_list
ist ein Fehler (falsches Ergebnis - sollte leer zurückgeben einstellen).Da Sie anscheinend Python 2.5 verwenden (es wäre schön, in Ihrem Q zu erwähnen, wenn Sie ein A für Versionen benötigen! = 2.6, übrigens die aktuelle Produktion ;-) und eine Liste anstelle eines Sets als das wollen Ergebnis empfehle ich:
import itertools ... return list(set(itertools.chain(*result_list)))
itertools ist im Allgemeinen eine großartige Möglichkeit, mit Iteratoren (und damit mit vielen Arten von Sequenzen oder Sammlungen) zu arbeiten, und ich empfehle Ihnen von Herzen, sich damit vertraut zu machen.
itertools.chain
insbesondere ist hier dokumentiert .quelle
itertools
Paket einzutauchen.itertools.chain
funktioniert übrigens auch in Python 2.4 einwandfrei.Sie können diesem Stil auch folgen
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']
quelle
Gewerkschaften werden nicht von Listen unterstützt, die geordnet sind, sondern von Gruppen. Schauen Sie sich set.union an .
quelle
Ich habe das Folgende verwendet, um Schnittpunkte zu erstellen, wodurch die Notwendigkeit von Mengen vermieden wird.
a, b= [[1,2,3], [1,2]] s = filter( lambda x: x in b, a)
oder,
s = [ x for x in b if x in a ]
quelle
verständnisvoll:
[*{ j for i in lists for j in i }]
oder
[*functools.reduce(lambda x,y: {*x, *y}, lists)]
quelle
desired_result = [x for y in lists for x in y]
quelle