it-swarm.com.de

So rahmen Sie zwei for-Schleifen im Listenverständnis ein python

Ich habe zwei Listen wie folgt

tags = [u'man', u'you', u'are', u'awesome']
entries = [[u'man', u'thats'],[ u'right',u'awesome']]

Ich möchte Einträge aus entries extrahieren, wenn sie sich in tags befinden:

result = []

for tag in tags:
    for entry in entries:
        if tag in entry:
            result.extend(entry)

Wie kann ich die beiden Schleifen als einzeiliges Listenverständnis schreiben?

Das sollte es tun:

[entry for tag in tags for entry in entries if tag in entry]
104
iCodez

Dies lässt sich am besten daran erinnern, dass die Reihenfolge der for-Schleife innerhalb des Listenverständnisses von der Reihenfolge abhängt, in der sie im herkömmlichen Loop-Ansatz angezeigt werden. Die äußerste Schleife kommt zuerst und anschließend die innere Schleife.

Das äquivalente Listenverständnis wäre also:

[entry for tag in tags for entry in entries if tag in entry]

Allgemein, if-else -Anweisung steht vor der ersten for-Schleife, und wenn Sie nur eine if -Anweisung haben, steht sie am Ende. Wenn Sie beispielsweise eine leere Liste hinzufügen möchten und tag nicht im Eintrag ist, würden Sie dies folgendermaßen tun:

[entry if tag in entry else [] for tag in tags for entry in entries]
123
Rohit Jain

Das entsprechende LC wäre

[entry for tag in tags for entry in entries if tag in entry]

Die Reihenfolge der Schleifen in den LC ist ähnlich wie in verschachtelten Schleifen, die if-Anweisungen enden und die bedingten Ausdrücke enden ungefähr am Anfang

[a if a else b for a in sequence]

Demo ansehen -

>>> tags = [u'man', u'you', u'are', u'awesome']
>>> entries = [[u'man', u'thats'],[ u'right',u'awesome']]
>>> [entry for tag in tags for entry in entries if tag in entry]
[[u'man', u'thats'], [u'right', u'awesome']]
>>> result = []
    for tag in tags:
        for entry in entries:
            if tag in entry:
                result.append(entry)


>>> result
[[u'man', u'thats'], [u'right', u'awesome']]

EDIT - Da das Ergebnis reduziert werden muss, können Sie ein ähnliches Listenverständnis verwenden und dann die Ergebnisse reduzieren.

>>> result = [entry for tag in tags for entry in entries if tag in entry]
>>> from itertools import chain
>>> list(chain.from_iterable(result))
[u'man', u'thats', u'right', u'awesome']

Addiert man dies zusammen, könnte man es einfach tun

>>> list(chain.from_iterable(entry for tag in tags for entry in entries if tag in entry))
[u'man', u'thats', u'right', u'awesome']

Anstelle eines Listenverständnisses verwenden Sie hier einen Generatorausdruck. (Passt auch perfekt zur Zeichenbeschränkung von 79 (ohne den list -Aufruf))

5
Sukrit Kalra
tags = [u'man', u'you', u'are', u'awesome']
entries = [[u'man', u'thats'],[ u'right',u'awesome']]

result = []
[result.extend(entry) for tag in tags for entry in entries if tag in entry]

print(result)

Ausgabe:

['man', 'thats', 'right', 'awesome']
2
Raghav Gupta