Ich habe eine Liste von Sets:
setlist = [s1,s2,s3...]
Ich möchte s1 s2 s3 ...
Ich kann eine Funktion schreiben, die dies durch eine Reihe von paarweisen s1.intersection(s2)
, usw.
Gibt es einen empfohlenen, besseren oder eingebauten Weg?
Ich habe eine Liste von Sets:
setlist = [s1,s2,s3...]
Ich möchte s1 s2 s3 ...
Ich kann eine Funktion schreiben, die dies durch eine Reihe von paarweisen s1.intersection(s2)
, usw.
Gibt es einen empfohlenen, besseren oder eingebauten Weg?
Ab Python-Version 2.6 können Sie mehrere Argumente für set.intersection()
, wie
u = set.intersection(s1, s2, s3)
Wenn die Sätze in einer Liste enthalten sind, bedeutet dies Folgendes:
u = set.intersection(*setlist)
donde *a_list
es Listenerweiterung
Beachten Sie, dass set.intersection
es no eine statische Methode, die jedoch die funktionale Notation verwendet, um die Schnittmenge der ersten Menge mit dem Rest der Liste anzuwenden. Wenn die Argumentliste also leer ist, schlägt dies fehl.
Eindeutig set.intersection
ist das, was Sie hier wollen, aber für den Fall, dass Sie jemals eine Verallgemeinerung von "nimm die Summe von all diesen", "nimm das Produkt von all diesen", "nimm das xor von all diesen" brauchen, ist das, wonach Sie suchen, die reduce
Funktion:
from operator import and_
from functools import reduce
print(reduce(and_, [{1,2,3},{2,3,4},{3,4,5}])) # = {3}
oder
print(reduce((lambda x,y: x&y), [{1,2,3},{2,3,4},{3,4,5}])) # = {3}
Wenn Sie nicht über Python 2.6 oder höher verfügen, besteht die Alternative darin, eine explizite for-Schleife zu schreiben:
def set_list_intersection(set_list):
if not set_list:
return set()
result = set_list[0]
for s in set_list[1:]:
result &= s
return result
set_list = [set([1, 2]), set([1, 3]), set([1, 4])]
print set_list_intersection(set_list)
# Output: set([1])
Sie können auch Folgendes verwenden reduce
:
set_list = [set([1, 2]), set([1, 3]), set([1, 4])]
print reduce(lambda s1, s2: s1 & s2, set_list)
# Output: set([1])
Viele Python-Programmierer mögen sie jedoch nicht, einschließlich Guido selbst :
Vor etwa 12 Jahren erhielt Python lambda, reduce(), filter() und map(), dank (ich glaube) eines Lisp-Hackers, der sie vermisste und funktionierende Patches einreichte. Aber trotz des PR-Wertes denke ich, dass diese Funktionen aus Python 3000 gestrichen werden sollten.
Jetzt also reduce(). Diese Funktion habe ich eigentlich immer am meisten gehasst, denn abgesehen von ein paar Beispielen mit + oder * muss ich fast jedes Mal, wenn ich einen reduce()-Aufruf mit einem nicht-trivialen Funktionsargument sehe, zu Stift und Papier greifen, um zu skizzieren, was eigentlich in diese Funktion eingespeist wird, bevor ich verstehe, was reduce() eigentlich tun soll. Meiner Meinung nach ist die Anwendbarkeit von reduce() also auf assoziative Operatoren beschränkt, und in allen anderen Fällen ist es besser, die Akkumulationsschleife explizit auszuschreiben.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.