Seite 1 von 1
Auswertung Liste mit Dictionarie über set()
Verfasst: Donnerstag 24. September 2009, 12:39
von gurami
Hallo habe folgenden Coe:
Code: Alles auswählen
print dateien # Diese Liste enthaelt alle KEYS und Values der eingelesenen Dateien
gleichekeys = set(dateien.keys()) & set(dateien.keys()) # Menge aller gleichen Keys, wird hier erzeugt
# Erzeugung: Schnittemenge zweier Teilmengen)
key_nicht_gleich = set(dateien.keys()) ^ set(dateien.keys()) # Erzeugung eines neues Set, dass alle Elemente des 1. Operanden enthält,
# die nicht im 2. Operanden enthalten sind.(Set = Neue Menge)
print "ERGEBNIS DER AUSWERTUNG"
print "-------------------------"
for key in gleichekeys:
print "Gleicher KEY mit dazugehoeriger Sequenz \n"
print "KEY: " + key
print "SEQUENZ: " + dateien[key]+dateien[key]# Ausgabe des Wertes des Keys (= Sequenz des Organismus)
print "\n"
# Ausgabe der KEYS die nicht in allen Dateien sind
for nichtgleich in key_nicht_gleich:
print "Dieser Key ist nicht gleich:"
print "KEY: " + nichtgleich
und bekomme folgenden Fehlermeldung:
Code: Alles auswählen
[{'>A': 'aaaa', '>B': 'xxxxxxx', '>maus': 'zzzzzzzTTTTTTT'}, {'>A': 'cgtu', '>C': 'zzzTTTT', '>D': 'xxxx', '>maus': 'ccccc'}]
Traceback (most recent call last):
File "./paras.py", line 141, in <module>
gleichekeys = set(dateien.keys()) & set(dateien.keys()) # Menge aller gleichen Keys, wird hier erzeugt
AttributeError: 'list' object has no attribute 'keys'
Ich stehe momentan wie der Ochs vor dem Berg, ich sehe den Wald vor lauter Bäumen nicht mehr
Danke schon mal.
gruss gurami

Verfasst: Donnerstag 24. September 2009, 12:53
von sma
`dateien` enthält eine Liste und kein Dict wie du wohl glaubst.
Stefan
Verfasst: Donnerstag 24. September 2009, 13:00
von gurami
ja Lsite war klar mit Dictionaries drinnen und von dennen brauche ich nur die Schlüssel
Verfasst: Donnerstag 24. September 2009, 13:02
von Hyperion
Gib doch mal bitte ein Beispiel der Datenstruktur "dateien"!
So a la:
Sonst brauchen wir nicht spekulieren. Nach deinem ersten Posting hat sma nämlich recht!
und es gibt code-tags hier im Board!
Verfasst: Donnerstag 24. September 2009, 13:06
von gurami
Das steht in dateien drin:
[{'>A': 'aaaa', '>B': 'xxxxxxx', '>maus': 'zzzzzzzTTTTTTT'}, {'>A': 'cgtu', '>C': 'zzzTTTT', '>D': 'xxxx', '>maus': 'ccccc'}]
Verfasst: Donnerstag 24. September 2009, 13:22
von gurami
Wenn ich das richtig verstehe müsste ich doch sowas schreiben:
key= set(dateien[ELEMENTE][SCHLÜSSEL].keys()) & key= set(dateien[ELEMENTE][SCHLÜSSEL].keys())
um eine Liste zu haben die alle meine ScHlüssel enthält
das programm liest mehrere Dateien mit Sequenzen ein.
grus gurami
Verfasst: Donnerstag 24. September 2009, 13:27
von Hyperion
Also eine Liste mit allen Schlüsseln erhält man z.B. so:
Code: Alles auswählen
In [51]: from itertools import chain
In [52]: files = [{'>A': 'aaaa', '>B': 'xxxxxxx', '>maus': 'zzzzzzzTTTTTTT'}, {'>A': 'cgtu', '>C': 'zzzTTTT', '>D': 'xxxx', '>maus': 'ccccc'}]
In [53]: generals = list(chain.from_iterable([key.keys() for key in files]))
In [54]: generals
Out[54]: ['>A', '>B', '>maus', '>A', '>C', '>D', '>maus']
Was willst Du denn mit denen nun machen? Was ist eigentlich Dein Ziel?
Verfasst: Donnerstag 24. September 2009, 13:40
von gurami
Das Ziel ist eine Menge in der alle Schlüssel stehen die in zwei Mengen also sprich in allen eingelesenen dateien gleich sind
gruss gurami
Verfasst: Donnerstag 24. September 2009, 13:47
von Hyperion
Ersetze das list() in IN[53] durch ein set()

Verfasst: Donnerstag 24. September 2009, 13:58
von gurami
gibt es noch ne andere möglichkeit bissl mehr in die richtung wie ich das geschrieben habe, bin halt kompletter Anfänger, desghalb verstehe ich noch nicht alles.
gruss gurami
Verfasst: Donnerstag 24. September 2009, 14:05
von BlackJack
@gurami: Wie können alle eingelesenen Dateien *zwei* Mengen sein? Ich sehe da nur eine Menge, nämlich die der eingelesenen Dateien.
Das Du in Deinem ersten Beitrag so etwas wie ``set(dateien.keys()) & set(dateien.keys())`` machst, ist total unsinnig, weil sowohl ``a & a`` als auch ``a ^ a`` auf Mengen nicht sinnvoll sind. Ersteres hat *immer* `a` als Ergebnis und Letzteres *immer* die leere Menge.
Also *was* sind Deine *zwei* Mengen und wie soll das Ergebnis aussehen?
@Hyperion: Alternative:
Code: Alles auswählen
In [21]: reduce(operator.or_, (set(x.keys()) for x in files), set())
Out[21]: set(['>A', '>B', '>C', '>D', '>maus'])
Verfasst: Donnerstag 24. September 2009, 14:50
von Hyperion
BlackJack hat geschrieben:
@Hyperion: Alternative:
Code: Alles auswählen
In [21]: reduce(operator.or_, (set(x.keys()) for x in files), set())
Out[21]: set(['>A', '>B', '>C', '>D', '>maus'])
Hui... harte Nuss. Aber ich glaube jetzt hab ichs (fast).
Erzeugt einen Generator, der jeweils eine Menge von den Schlüsseln der einzelnen dicts erzeugt.
muss wohl äquivalent sein zu set.union(), was wohl das Bit-weise Verknüpfen implementiert / (also den den "|" Operator).
Damit bildest Du also die Schnittmenge zwischen zwei Mengen.
Da es biliebig viele sein könnten, nutzt Du reduce(), um iterativ immer das Ergebnis der letzten Schnittmenge mit der folgenden zu bilden.
So weit richtig?
Was ich nicht verstehe ist dieser "initializer" "set()" am Schluss. Wozu dient der? In diesem Beispiel kann ich den auch weglassen... also wird er wohl erst bei >2 Sets zum Zuge kommen?
Verfasst: Donnerstag 24. September 2009, 15:21
von BlackJack
@Hyperion: Das `operator.or_` hast Du auch ohne einen Blick in die Dokumentation richtig erfasst:
Code: Alles auswählen
In [22]: operator.or_?
Type: builtin_function_or_method
Base Class: <type 'builtin_function_or_method'>
String Form: <built-in function or_>
Namespace: Interactive
Docstring:
or_(a, b) -- Same as a | b.
Das `set()` am Ende ist aber nicht bei >2 Elementen (besonders) wichtig sondern bei 0 Elementen. Dann muss `reduce()` ja auch etwas zurückgeben können.
Verfasst: Donnerstag 24. September 2009, 15:32
von Hyperion
BlackJack hat geschrieben:
Das `set()` am Ende ist aber nicht bei >2 Elementen (besonders) wichtig sondern bei 0 Elementen. Dann muss `reduce()` ja auch etwas zurückgeben können.
Ah... kapiert
Danke für dieses Beispiel. Bei diesen funktionalen Ausdrücken muss ich noch viel lernen - da muss man sich langsam einen "Blick" für erarbeiten; da helfen solche kleinen Sachen ungemein

Verfasst: Donnerstag 24. September 2009, 16:52
von gurami
danke für die Hilfe Leute
gruss gurami