Wenn Sie nicht über Python 2.6 oder höher verfügen, können Sie alternativ eine explizite for-Schleife 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 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 es jedoch nicht, einschließlich Guido selbst :
Vor ungefähr 12 Jahren erwarb Python Lambda, Reduce (), Filter () und Map (), mit freundlicher Genehmigung eines (ich glaube) Lisp-Hackers, der sie verpasst und funktionierende Patches eingereicht hat. Trotz des PR-Werts sollten diese Funktionen aus Python 3000 entfernt werden.
Reduzieren Sie jetzt (). Dies ist eigentlich die, die ich immer am meisten gehasst habe, denn abgesehen von einigen Beispielen mit + oder * muss ich fast jedes Mal, wenn ich einen redu () - Aufruf mit einem nicht trivialen Funktionsargument sehe, Stift und Papier greifen Diagramm, was tatsächlich in diese Funktion eingespeist wird, bevor ich verstehe, was das redu () tun soll. Meiner Meinung nach ist die Anwendbarkeit von redu () weitgehend auf assoziative Operatoren beschränkt, und in allen anderen Fällen ist es besser, die Akkumulationsschleife explizit zu schreiben.
reduce
sei "auf assoziative Operatoren beschränkt", was in diesem Fall anwendbar ist.reduce
ist sehr oft schwer herauszufinden, aber für&
ist nicht so schlimm.