2012-08-31 17 views
10

Angenommen, ich habe eine Liste:iterieren (Artikel, andere) in einer Liste

l = [0, 1, 2, 3] 

Wie kann ich über die Liste iterieren, aus der Liste zusammen mit seinem Komplement jedes Element zu nehmen? Das heißt,

for item, others in ... 
    print(item, others) 

Ich suche nach einem prägnanten Ausdruck, den ich in einem Verständnis verwenden kann drucken würde
0 [1, 2, 3] 
1 [0, 2, 3] 
2 [0, 1, 3] 
3 [0, 1, 2] 

Ideale.

Antwort

13

Das ist ganz einfach und verständlich:

for index, item in enumerate(l): 
    others = l[:index] + l[index+1:] 

Sie konnte einen Iterator aus diesem machen, wenn Sie darauf bestehen:

def iter_with_others(l): 
    for index, item in enumerate(l): 
     yield item, l[:index] + l[index+1:] 

Giving es Nutzung ist:

for item, others in iter_with_others(l): 
    print(item, others) 
+0

Das funktioniert gut und ist genau das, was für ecatmur gefragt, aber scheint eine Übung in der unentgeltlichen Listenerstellung. Es könnte mit größeren Listen ziemlich schlecht funktionieren. Ich frage mich, ob es besser wäre, ein Wrapper-Objekt zu erstellen, das einen Blick in die ursprüngliche Liste ermöglicht. –

+0

@StevenRumbalski: Ja, aber ich werde dies als eine Übung für den Leser verlassen, es sei denn, es gibt eine große Nachfrage. – orlp

3

Beantworten Sie meine eigene Frage, ist es möglich,zu verwendendie Tatsache ausnutzend, dass das Ergebnis in lexikographischer Reihenfolge ausgegeben wird:

Dies ist jedoch ziemlich unklar; Nightcrackers Lösung ist ein Los einfacher für den Leser zu verstehen!

2

Was

über
>>> [(i, [j for j in L if j != i]) for i in L] 
[(0, [1, 2, 3]), (1, [0, 2, 3]), (2, [0, 1, 3]), (3, [0, 1, 2])] 

OK, das ist eine Unmenge von Tests und Lösung des @ nightcracker ist wahrscheinlich effizienter, aber eh ...

+0

Sie könnten Generator-Ausdrücke anstelle von Listen-Comprehensions verwenden und vermeiden so das Erstellen unnötiger Listen, wie es @StevenRumbalski geträumt hat. –

+0

Ja, ich könnte einen Generator für den ganzen Ausdruck verwenden, aber nicht für die innere Schleife: das OP wollte Listen drucken, keine Generatoren. –

+0

Richtig, zumindest in seinem Beispiel. Die Frage ist, ob er das wirklich mit den Ergebnissen machen will. Aber er kann das für sich entscheiden. –

Verwandte Themen