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 :D

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:

Code: Alles auswählen

dateien = [
    {
        "foo": "bar"
    },
    {
    ...
    }
]
Sonst brauchen wir nicht spekulieren. Nach deinem ersten Posting hat sma nämlich recht!

und es gibt code-tags hier im Board!

Code: Alles auswählen

 (ohne das Leerzeichen eben)

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).

Code: Alles auswählen

(set(x.keys()) for x in files)
Erzeugt einen Generator, der jeweils eine Menge von den Schlüsseln der einzelnen dicts erzeugt.

Code: Alles auswählen

das operator.or_
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
:D

gruss gurami