Verschiedene Listen erstellen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
amittel
User
Beiträge: 4
Registriert: Dienstag 29. November 2011, 11:48

Hallo!
Ich bin grad auf ein Problem gestoßen, dass ich nicht lösen kann.
Ich habe einen RSS-Feed in folgender Form

Code: Alles auswählen

<rss>
     <item>
          <title>Titel.A.szene</title>
          <author>Hans Mueller</author>
          <link>adresse</link>
     </item>
     <item>
          <title>Titel.B.ist.toll</title>
          <author>Werner B.</author>
          <link>adresse</link>
     </item>
     <item>
          <title>Anderer.Name.X</title>
          <author>Name</author>
          <link>adresse</link>
     </item>
usw....
</rss>
In diesem möchte ich nun nach bestimmten Titeln suchen. Die zu suchenden Titeln sind in einer Datei abgelegt, die eingelesen wird. Auch das klappt.
Was allerdings nicht klappt ist, dass ich je eine eigenständige Liste pro zu suchenden Titel anlege.
Mein bisheriges Konstrukt sieht folgendermaßen aus

Code: Alles auswählen

for item in self.feedxml.getiterator('item'):
			episode = list(item)
			#print (len(episode))
			title = episode[0].text
			description = episode[1].text
			pubdate = episode[2].text
			link = episode[3].text
			author = episode[4].text
		
			for serie in self.c_series:
				if serie in title:
					print 'title:' + title
					
c_series ist eine Liste mit den zu suchenden Titeln (aus der Datei). Er gibt auch alle Titel aus, wie er sie in der XML-Datei findet. Leider habe ich jetzt Probleme jeweils eine Liste zu erstellen, dessen Name gleich dem Titel sein soll und darin alle gefunden Einträge rein sollen.

Meine Idee war ja, dass ich vorher die Listen erstelle nach den Namen, die aus der Datei ausgelesen wurden. Leider komm ich dann nicht weiter, wie ich in der Schleife dann die richtige Liste wählen soll... Im Moment hab ich ein Brett vorm Kopf :(

Ich weiß, dass es ein wenig kompliziert klingt, aber vielleicht hat einer eine Idee. Und wenn noch was unklar sein sollte immer her damit.
deets

Du suchst nach der falschen Datenstruktur. Was du willst, ist ein Dictionary, welches den Titel auf eine Liste der darunter gefassten Artikel beinhaltet.

Besonders einfach und elegant (wenn man nicht problembaer heisst) geht das mit "defaultdict":

Code: Alles auswählen

from collections import defaultdict

title2articlenum = defaultdict(list)

for articlenum, title in enumerate("abcdefgabcdefg"):
     title2articlenum[title].append(articlenum)

Ich bin mir aber nicht sicher, ob das inhaltlich wirklich das ist, was du willst - ich finde, nach gleichem Titel zu gruppieren hoert sich etwas seltsam an, denn wieviele Duplikate mit demselben Titel gibt es denn?!?
BlackJack

@deets: Vielleicht ist damit ja ein Serientitel gemeint und kein Episodentitel.
amittel
User
Beiträge: 4
Registriert: Dienstag 29. November 2011, 11:48

Ja, das hätte ich vllt. mal erwähnen sollen. Es geht um Serien. Ich will mir gerne eine kleine Gedankenstütze programmieren.
Ich habe meine Serien und die haben einen Titel in der Form Serienname.S01E03.
Und jetzt möchte ich mir einfach eine Struktur erstellen, so dass ich dann ein Menu daraus formen kann.
Vorgestellt hatte ich mir das wie folgt:

Code: Alles auswählen

Serienname
   |--- Titel S01E01
   |--- Titel S02E05
   |--- Titel S99E99
usw.
Und in dem Feed sind eben nur die Titel, die ich rausgefiltert habe, aber jetzt in keine Struktur pressen kann. Aber die Sache mit dem Dictionary werde ich mir mal genauer ansehen.
Viellleicht gibt es ja noch ein andere Möglichkeit. Danke estmal!
amittel
User
Beiträge: 4
Registriert: Dienstag 29. November 2011, 11:48

Ok ich hab's! Juhu :)

Der Schubser in Richtung defaultdict war der Richtige.

Einfach zwei Schleifen und ich hab mein gewünschtes Ergebnis.

Code: Alles auswählen

d = defaultdict(list)
		for v in l_series:
			for serie3 in self.c_series:
				if serie3 in v:
					d[serie3].append(v)
		
		pprint.pprint(d.items())
c_series ist meine List mit allen gefundenen Titeln und c_series sind die Titel aus der Datei und fertig. Genial einfach, gewusst wie :D

Ausgabe habe ich dann

Code: Alles auswählen

[('Bones',
  ['[DEUTSCH] Bones.S01E01.German']),
 ('The.Walking.Dead',
  ['[DEUTSCH] The.Walking.Dead.S01E01',
   '[DEUTSCH] The.Walking.Dead.S99E99',
 ('Chuck',
  ['[ENGLISCH] Chuck.S01E01'])]
BlackJack

@amittel: Die Namensgebung ist sehr schlecht. Es fällt schwer den Sinn zu verstehen bei Namen die im Grunde nichts aussagen wie `d`, `v`, oder `serie3`. Bei letzterem legt die `3` auch den Verdacht nahe, dass die Methode zu lang und umfangreich ist, wenn Du anfangen musst Namen durch zu nummerieren. Auch die Präfixe `l_` und `c_` helfen nicht beim verstehen des Quelltextes. Man sollte das immer aus den Augen eines Fremden sehen — denn all zu oft ist man selbst als Autor eines Quelltextes nach ein paar Monaten selber der Fremde der die ganzen Kürzel nicht mehr auf Anhieb versteht.

Etwas kürzer und effizienter kann man die innere ``for``-Schleife durch `any()` mit einem Generator-Ausdruck ersetzen (ungetestet):

Code: Alles auswählen

    title2episode_names = defaultdict(list)
    for episode_name in episode_names:
        if any(title in episode_name for title in self.titles):
            title2episode_names[title].append(episode_name)
Antworten