Dictionaries und Schlüsssel

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 , 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
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

so ungefähr?

Code: Alles auswählen

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

print set(d1.keys()) & set(d2.keys())
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
gurami
User
Beiträge: 21
Registriert: Freitag 18. September 2009, 09:41

Danke schön das hilft ein wenig weiter.

gruss gurami
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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

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
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

@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
Zuletzt geändert von cofi am Dienstag 22. September 2009, 14:55, insgesamt 1-mal geändert.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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:
Das Leben ist wie ein Tennisball.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

@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.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
gurami
User
Beiträge: 21
Registriert: Freitag 18. September 2009, 09:41

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
Antworten