2016-04-06 9 views
2

Ich versuche Listenkomprehensionen zu lernen, und ich habe diese triviales Beispiel erstellt, in dem ich die Saiten in die Liste a drucken möchten, die enthalten entweder die Worte fox oder rabbit während diejenigen ohne die red enthalten oder blue. So wie es aussieht, funktioniert mein Beispiel, aber ich möchte wissen, ob es zu einem einzigen Verständnis kondensiert werden kann, was die Notwendigkeit von Mengenoperationen negiert.Python Nested Listenkomprehension auf mehreren Listen

a = ["the red fox", "the blue fox", "the green fox", 
    "the yellow fox", "the red rabbit", "the yellow rabbit"] 
b = ["fox", "rabbit"] 
c = ["red", "blue"] 

d = set([e for e in a for f in b if f in e]) - set([e for e in a for f in c if f in e]) 

for d in d: 
    print d 

Antwort

0

Ihre Liste Verständnis würde wie folgt aussehen:

d = [x for x in a if any(y in x for y in b) and not any(y in x for y in c)] 

Beachten Sie, wie es fast wie Ihre Spezifikation liest.

Das Ergebnis ist

['the green fox', 'the yellow fox', 'the yellow rabbit'] 

Da Ihr Beispielcode die einfache alte in Prüfung verwendet, ich nehme an, Sie suchen nach Teil hier, und „Blau“ sollte sein, in „die bläulichen Farbe in Betracht gezogen werden ". Andernfalls teilen Sie alle Ihre Zeichenfolgen in a durch Leerzeichen und verbinden Sie sie nach der Berechnung Ihres Ergebnisses.

0

Alternativ, wenn Sie wirklich Sets verwenden möchten, können Sie dies tun:

[x for x in a if set(x.split() + b) and set(c).isdisjoint(x.split())]