2016-04-07 10 views
-6

Ich bin totaler Anfänger, also halte das so einfach wie möglich. Ich versuche, diesen bestimmten Code zu arbeiten, aber ich verstehe nicht, was wirklich in diesem if any(post.title... Schleife geschieht.Was macht wenn() in Python?

import feedparser 
d = feedparser.parse('feed0.rss', 'r') 
with open("./mystuff.txt", 'r') as mystuff: 
    mylines = mystuff.readlines() 
    for post in d.entries: 
     for myline in mylines: 
    --->  if any(post.title in myline for myline in mylines): 
       print("Here is one: " + post.title + " " + post.link) 

Meine Versuche, eine Antwort von Reddit (/r/learnpython) zu bekommen, gescheitert ist und hoffentlich jemand hier kann mir das verstehen helfen.

Das zweite Problem ist, dass dieser Code die "Here is one: " + post.title + so oft ausgibt, wie Zeilen in mystuff.txt vorhanden sind.

+3

Schau dir an, wie oft "für myline in mylines" in diesem Block erscheint. – TigerhawkT3

+1

Mit 'for loop in mylines' durchläuft es jeden Eintrag in' mylines' und prüft, ob Sie 'post.title in myline' für' alle' Einträge haben. Aber warum bringst du das in eine andere Schleife über meine Zeilen? – Matthias

Antwort

0
if any(post.title in myline for myline in mylines) 

Hat irgendein Element von mylinespost.title enthalten? True/False

Siehe auch: https://docs.python.org/2/library/functions.html#any

edit:

post.title in myline for myline in mylines ist ein Generator Ausdruck, der zu vereinfachen, können wir sagen, ist ähnlich einer Liste.

Angenommen post.title ist foo und mylines ist ['foo', 'bar', 'foobar', 'barbaz'].

[post.title in myline for myline in mylines] (den Generator auf eine Liste Gießen, auch als Liste Verständnis bekannt), gibt Ihnen

[ 
    True, # 'foo' is in 'foo' 
    False, # 'foo' is not in 'bar' 
    True, # 'foo' is in 'foobar' 
    False # 'foo' is not in 'barbaz' 
] 

Jetzt nach den docs ich oben verbunden, Sie any als umschreiben kann:

def any(iterable): 
    for element in iterable: 
     if element: 
      return True 
    return False 

Die einzige Möglichkeit, False zurückgibt, ist, wenn alle die Elemente in der iterable sind Falsy (zum Beispiel False, None, eine leere Liste/dict/set/st Klingeln usw., 0, usw.).

Unser iterables wie oben gezeigt enthält den Wert True, der kein falscher Wert ist. Daher gibt anyTrue zurück.

+0

+1 nur um zu klären, ich habe die Idee für diese Linie von http://StackOverflow.com/A/6531704/6170620, es hat funktioniert, aber ich habe nicht verstanden, warum. –

+0

Ich habe meine Antwort bearbeitet, um die Dinge klarer zu machen. Hat das geholfen? Wenn nicht, worüber genau sind Sie verwirrt? –

0

Bitte versuchen Sie, Ihren Code lesbar zu machen. Zu viele für und du kannst den untenstehenden Code noch strecken.

import feedparser 
d = feedparser.parse('feed0.rss', 'r') 
with open("./mystuff.txt", 'r') as mystuff: 
    lines = mystuff.readlines() 
    for line in lines: 
     for post in d.entries: 
      if (post.title in line): 
       print("Here is one: {0} {1}".format(post.title, post.link)) 

Danach können Sie die Datei auch schließen. Bezüglich Punkt 2) war die letzte for-Schleife in Klammern völlig falsch und gibt Ihnen mehrfach die gleiche Ausgabe. Bitte lassen Sie mich wissen, wenn dies Ihre Übung lösen.

Die Zeile, die Sie finden, funktioniert alleine, es ist ein kurzer Weg, um alles in einer Zeile zu komprimieren. Bevor Sie nur auf die Beiträge iterieren sollten:

wo mylines ist ein mystuff.readlines(). Hoffe das hilft dir beim Verstehen.

+0

Dieser Code gibt nichts zurück, obwohl ich einen passenden Titel in mystuff.txt habe es gibt auch den Titel für den XML-Feed, ein Zeichen pro Zeile. :) rss/xml ist von hier http://www.w3schools.com/xml/xml_rss.asp –

+0

@ J.D. Joe: Danke für die Eingabedatei. Versuchen Sie also, die Zeilen = mystuff.readlines() zu verwenden und iterieren Sie danach. Wenn mein Zeug leer ist, wird es natürlich keine Übereinstimmung geben !! Ich denke, du versuchst, einen Titel in einer .rss zu finden und anschließend Titel und Link zu drucken. Last but not least habe ich innerhalb von mystuff die Welt "XML Tutorial" ausprobiert und ich habe hier einen XML Tutorial http://www.w3schools.com/xml. Ich hoffe das ist was du erwartest, sonst habe ich deine Anfrage missverstanden. Ciao und habe einen tollen !! –