Seite 1 von 1

Dictionaries und Schlüsssel

Verfasst: Dienstag 22. September 2009, 11:57
von gurami
Hallo , bin absoluter Anfänger .

Ich wollte aus einer Liste die lauter Dictionaries enthält, die Keys der einzelnen Dictionaries prüfen ob sie gleich sind.
Habe mir auch einige Funktionen zu Dictioinaries angeschaut, verstehe diese auch soweit, mein Problem ist es halt ich bekomme keine vernünftige Umsetzung heraus.
Hat jemand einen Rat oder Tip wie man am besten vorgeht ?

gruss und danke gurami

Verfasst: Dienstag 22. September 2009, 12:01
von jbs
so ungefähr?

Code: Alles auswählen

d1 = { 1:2, 3:4 }
d2 = {4:2, 3:4 }

print set(d1.keys()) & set(d2.keys())

Verfasst: Dienstag 22. September 2009, 12:14
von gurami
Danke schön das hilft ein wenig weiter.

gruss gurami

Verfasst: Dienstag 22. September 2009, 12:15
von cofi
Willkommen im Forum!

Ich verstehe nicht so ganz, was du willst. Willst du ueberpruefen, dass alle die gleichen Schluessel haben? Oder ob die jew. Schluessel die gleichen Werte haben?

Fuer ersteren Fall:

Code: Alles auswählen

In [25]: a = dict(one=1, two=2)

In [26]: b = dict(one=1, two=2)

In [27]: c = dict(one=1, two=2)

In [28]: x = [a,b,c]

In [29]: from functools import partial

In [30]: test = lambda x,y: x.keys() == y.keys()

In [31]: initialized_test = partial(test, x[0])

In [32]: all(initialized_test(d) for d in x)
Out[32]: True

In [33]: x[0] = dict(three=3, four=4)

In [34]: all(initialized_test(d) for d in x)
Out[34]: False
Der Ablauf ist ganz einfach: Du definierst eine Funktion, die die keys auf Gleichheit testet.
Du bindest deinen Startwert an die Testfunktion (man kann den natuerlich auch fest verdrahten und spart sich ``partial`` damit, sollte man aber nicht)
Du fuehrst den test auf alle Dicts aus, sind alle True, sind die keys gleich.

Du koenntest aber mal erzaehlen, fuer was du das verwenden willst, der Ansatz ist IMHO seltsam.

Verfasst: Dienstag 22. September 2009, 12:54
von gurami
Das ganze ist ein Teil eines Bioinformatik Programmes, was ich am schreiben bin.
Du hast eine Liste mit Dictionaries, wobei die Keys, Organismen namen sind und der Value Sequenzen der Organismen.

Sind die Keys gleich , also der gleicher Organismus sollen die Sequenzen aneinander gehängt werden.

Mein Problem ist halt , da meine Programmierkenntnisse sind so gut sind, ich verstehe zwar einzelene Programmcodes, bekomme aber keine Vernünftigen Ansatz zusammen.
Ich habe schwierigkeiten ein Programm komplett umzusetzen.
Dann kommt momentannoch dazu, das ich Python dabei lernen muss.

gruss gurami

Verfasst: Dienstag 22. September 2009, 13:16
von cofi
@jbs Alles was du machst ist die Schnittmenge der Keys zu ermitteln, ich glaube das hilft wenig.

Fuer das Problem ist es aber besser, wenn du die Organismen als Klasse beschreibst, damit wirst du auch die Komplexitaet mit den Dictionaries los und kannst die Organismen direkt vergleichen:

Code: Alles auswählen

class Organism(object):
    def __init__(self, name, sequence):
        self.name = name
        self.sequence = sequence

    def __eq__(self, other):
        return self.name == other.name

    def __add__(self, other):
        return Organism(self.name, self.sequence + other.sequence)

In [88]: a = Organism("Hamster", "xyz")

In [89]: b = Organism("Hamster", "abc")

In [90]: a + b
Out[90]: <__main__.Organism object at 0x2c9d7d0>

In [91]: a == b
Out[91]: True

Verfasst: Dienstag 22. September 2009, 14:42
von EyDu
cofi hat geschrieben:

Code: Alles auswählen

True if self.name == other.name else False
Du hast da glaube ich etwas vergessen:

Code: Alles auswählen

(True if self.name == other.name else False) == True
:twisted:

Verfasst: Dienstag 22. September 2009, 14:51
von cofi
EyDu hat geschrieben:
cofi hat geschrieben:

Code: Alles auswählen

True if self.name == other.name else False
Du hast da glaube ich etwas vergessen:

Code: Alles auswählen

(True if self.name == other.name else False) == True
:twisted:
Pah! Viel zu einfach! :twisted:

Code: Alles auswählen

bool((True if self.name == other.name else False) == True) or False
Man kann natuerlich auch das langweilig und (urks!) lesbare nehmen:

Code: Alles auswählen

return self.name == other.name

Verfasst: Dienstag 22. September 2009, 16:17
von jbs
@cofi: Ich weiß. Aber mit war nicht klar was er haben wollte.
Ich wollte aus einer Liste die lauter Dictionaries enthält, die Keys der einzelnen Dictionaries prüfen ob sie gleich sind.

Verfasst: Dienstag 22. September 2009, 16:48
von gurami
Hallo, danke für die vielen antworten.
Der erste Post hat mir sehr gut geholfen und ddas Programm läuft soweit.

danke an alle nochmal gruss gurami