Auswertung Liste mit Dictionarie über set()

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
gurami
User
Beiträge: 21
Registriert: Freitag 18. September 2009, 09:41

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
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

`dateien` enthält eine Liste und kein Dict wie du wohl glaubst.

Stefan
gurami
User
Beiträge: 21
Registriert: Freitag 18. September 2009, 09:41

ja Lsite war klar mit Dictionaries drinnen und von dennen brauche ich nur die Schlüssel
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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)
gurami
User
Beiträge: 21
Registriert: Freitag 18. September 2009, 09:41

Das steht in dateien drin:

[{'>A': 'aaaa', '>B': 'xxxxxxx', '>maus': 'zzzzzzzTTTTTTT'}, {'>A': 'cgtu', '>C': 'zzzTTTT', '>D': 'xxxx', '>maus': 'ccccc'}]
gurami
User
Beiträge: 21
Registriert: Freitag 18. September 2009, 09:41

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
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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?
gurami
User
Beiträge: 21
Registriert: Freitag 18. September 2009, 09:41

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
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ersetze das list() in IN[53] durch ein set() ;-)
gurami
User
Beiträge: 21
Registriert: Freitag 18. September 2009, 09:41

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
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'])
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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?
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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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 :-)
gurami
User
Beiträge: 21
Registriert: Freitag 18. September 2009, 09:41

danke für die Hilfe Leute
:D

gruss gurami
Antworten