10 Stimmen

Iteriere über (Element, andere) in einer Liste

Angenommen, ich habe eine Liste:

l = [0, 1, 2, 3]

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

for element, andere in ...
    print(element, andere)

würde ausgeben

0 [1, 2, 3]
1 [0, 2, 3]
2 [0, 1, 3]
3 [0, 1, 2]

Am besten suche ich nach einem prägnanten Ausdruck, den ich in einer Comprehension verwenden kann.

13voto

orlp Punkte 106335

Dies ist ziemlich einfach und verständlich:

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

Sie könnten daraus einen Iterator machen, wenn Sie darauf bestehen:

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

Hier ist die Verwendung:

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

3voto

ecatmur Punkte 145884

Indem ich meine eigene Frage beantworte, ist es möglich, itertools.combinations zu verwenden und dabei die Tatsache auszunutzen, dass das Ergebnis in lexikografischer Reihenfolge ausgegeben wird:

from itertools import combinations
zip(l, combinations(reversed(l), len(l) - 1))

Allerdings ist dies ziemlich obskur; nightcrackers Lösung ist für den Leser viel verständlicher!

2voto

Pierre GM Punkte 18809

Was ist mit

>>> [(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 sind eine Unmenge von Tests und die Lösung von @nightcracker ist wahrscheinlich effizienter, aber na ja...

CodeJaeger.com

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.

Powered by:

X