In einem Dictionary < und > benutzen?

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.
_corn_
User
Beiträge: 27
Registriert: Montag 8. November 2021, 09:04

Guten Tag Zusammen,
ich stelle mich momentan folgendes Problem: Ich möchte gerne Nummern aus einem Dictionary mit einem festgelegt Wert vergleichen, ob dieser z.B. größer ist: Mein Code sieht momentan wie folgt aus:

Code: Alles auswählen

import csv

def read_number():
	with open('Datei.csv', encoding='utf-8', newline='', as csv_input:
		reader = csv.DictReader(csv_input, delimiter=';')
		lookup_number = {}
		for row in reader:
			lookup_number[row['Nummer']] = row
	return lookup_number

def main():
	number = read_number()
	for row in number:
		if number > 1:
			#und dann würde es hier weiter gehen

if __name__ == "__main__":
	main()
Momentan wirft er mir so den Fehler raus:"TypeError: '>' not supported between instances of 'dict' and 'int'". Wenn ich das gleiche mit = oder != 1 mache, funktioniert es. Kann ich > und < trotzdem irgendwie verwendet oder gibt es einen alternativen Weg? Vielen Dank schonmal im Vorraus für die Antworten.

LG Corn
_corn_
User
Beiträge: 27
Registriert: Montag 8. November 2021, 09:04

Und nicht wundern, die Einrückung wurde hier irgendwie nicht richtig übernommen: Bei mir ist sie richtig mit 4 Leerzeichen :D
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@_corn_,
du verwendest TAB zum Einrücken, besser wären 4 Leerzeichen.

In der Zeile:
if number > 1
ist number ein Dictionary, so wie er von der Funktion read_number() zurückgegeben wurde.

Du willst wahrscheinlich:

Code: Alles auswählen

numbers = read_number()
    for number in numbers.values():
        if number > 1:
_corn_
User
Beiträge: 27
Registriert: Montag 8. November 2021, 09:04

Mir wird da leider der Fehlercode '>' not supported between instances of 'dict' and 'int' herausgegeben @rogerb
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du vergleichst ein Wörterbuch mit einer Zahl. Was erwartest du denn dann? Wenn ich dir einen Duden in die Hand drücke, und sage, “ist der kleiner 100”, hast du da eine sinnvolle Antwort?

Du musst dir klarmachen, was du da aus read_number() bekommst, und wie das sinnvoll zu verarbeiten ist.
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

_corn_ hat geschrieben: Freitag 3. Dezember 2021, 10:33 Mir wird da leider der Fehlercode '>' not supported between instances of 'dict' and 'int' herausgegeben @rogerb
Wie sieht denn dein Code jetzt nach der Änderung aus?
_corn_
User
Beiträge: 27
Registriert: Montag 8. November 2021, 09:04

@__deets__ Nein natürlich hätte ich da keine sinvolle Antwort, aber das ist doch auch nicht wonach ich frage oder zumindest fragen will? Wenn du mir ein Duden in die Hand drückst und sagst: "Auf Seite 1 steht ein Eintrag und der ist "2". Dann kann ich dir eine sinnvolle Antwort geben.
vielleicht habe ich auch ein Denkfehler, aber ich bekomme aus lookup_number eine Zahl heraus: Also einen Eintrag der z.B. wie folgt aussieht: 2 : {'Key1':'Datensatz1, 'Key2':'Datensatz2, 'Nummer':'2'}. Kann ich dann nicht fragen, ob der Eintrag also '2' > 1 ist?
Und wenn ich die Abfrage falsch formuliere, wie muss ich sie dann formulieren?
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du selbst sagst, damit das sinnvoll wird, musst du einen bestimmten Eintrag nachschlagen, und dann lässt sich die Frage beantworten.

Wo ist diese Nachschlageoperation denn in deinem Code? Woher soll Python wissen, welcher deiner 3 Einträge der zu vergleichende ist? Das wirst du schon angeben müssen.
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

_corn_ hat geschrieben: Freitag 3. Dezember 2021, 10:57 Und wenn ich die Abfrage falsch formuliere, wie muss ich sie dann formulieren?
Das hatte ich doch geposted. Hast du das richtig umgesetzt?
_corn_
User
Beiträge: 27
Registriert: Montag 8. November 2021, 09:04

@rogerb ja, habe ich so ausprobiert:

Code: Alles auswählen

def read_number():
    with open('Datei.csv', encoding='utf-8', newline='') as csv_input:
        reader = csv.DictReader(csv_input, delimiter=';')
        lookup_number = {}
        for row in reader:
            lookup_number[row['Nummer']] = row
    return lookup_number

def main():
    numbers = read_number()
    print(numbers)
    for number in numbers.values():
        if number > 1:
            print("Geht")
            
if __name__ == "__main__":
    main()

Dabei kommt dann folgende Fehlermeldung: TypeError: '>' not supported between instances of 'dict' and 'int'
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@_corn_,

das was in der read_number() Funktion "row" enthält, kommt in der main() Funktion in die Variable "number". Wenn das ein Dictionary ist, entsteht der Fehler.
Was ist denn die Ausgabe von
print(numbers)
?
_corn_
User
Beiträge: 27
Registriert: Montag 8. November 2021, 09:04

_corn_ hat geschrieben: Freitag 3. Dezember 2021, 10:57 2 : {'Key1':'Datensatz1, 'Key2':'Datensatz2, 'Nummer':'2'}
@rogerb
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

`number` ist halt ein Dict, dass kann man nicht mit einem Integer vergleichen. Aus dem Dict müsstest du dir noch den Wert des Schlüssels ziehen, den du vergleichen willst, also `number['Nummer'].

Gruß, noisefloor
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@_corn_,

also enthält number das: {'Key1':'Datensatz1, 'Key2':'Datensatz2, 'Nummer':'2'}
und das kann man nicht mit einem int vergleichen.

Versuch mal das:

Code: Alles auswählen

numbers = read_number()
    print(numbers)
    for number in numbers:
        if number > 1:
_corn_
User
Beiträge: 27
Registriert: Montag 8. November 2021, 09:04

@rogerb dann bekomm ich die Meldung TypeError: '>' not supported between instances of 'str' and 'int'
@noisfloor wie genau würde das aussehen: wenn ich das mache, sagt er mir: TypeError: string indices must be integers
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du musst auf den gewünschten Wert zugreifen. number[key] > zahl. Python kann nicht erraten, welche der beliebig vielen Schlüssel du denn meinst vergleichen zu wollen.
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

number[key] ist auch ein string. (also wenn man über numbers.values() iteriert, sonst ist es ein Dictionary)

@ulipy,

du hattest geschrieben, dass dies die Ausgabe von print(numbers) ist:
2 : {'Key1':'Datensatz1, 'Key2':'Datensatz2, 'Nummer':'2'}

Das kann nicht sein, da da Anführungszeichen nach Datensatz1 und Datensatz2 fehlen.
Und wenn die erste 2 wirklich ein int ist, dann funktioniert das:

Code: Alles auswählen

numbers = {2 : {'Key1':'Datensatz1', 'Key2':'Datensatz2', 'Nummer':'2'}}

for number in numbers:
    if number > 1:
        print(f"{number} ist größer als 1")

"""
Ausgabe:
2 ist größer als 1
"""
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@rogerb: der Code, wie das Wörterbuch entsteht, steht ja da. Und der Inhalt kommt nunmal aus einem DictReader, und der liefert nur Strings als Werte.

@_corn_: Du mußt selbst das, was Du liest und eine Zahl repräsentiert, in eine Zahl umwandeln:

Code: Alles auswählen

def read_number():
    with open('Datei.csv', encoding='utf-8', newline='') as csv_input:
        reader = csv.DictReader(csv_input, delimiter=';')
        lookup_number = {}
        for row in reader:
            lookup_number[int(row['Nummer'])] = row
    return lookup_number
wobei sowohl der Name der Funktion `read_number`, als auch das Ergebnis `lookup_number` irreführend sind, denn es wird nicht nur eine Zahl geladen, und Du schlägst mit lookup_number auch keine Zahl nach, sondern ein Wörterbuch, was auch immer dessen Inhalt ist.
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

Und der Inhalt kommt nunmal aus einem DictReader, und der liefert nur Strings als Werte.
Stimmt, das hätte ich selber sehen müssen:

Der Komplette Code sollte dann so aussehen:

Code: Alles auswählen

import csv


def read_number():
    with open('Datei.csv', encoding='utf-8', newline='') as csv_input:
        reader = csv.DictReader(csv_input, delimiter=';')
        lookup_number = {}
        for row in reader:
            lookup_number[int(row['Nummer'])] = row
    return lookup_number

def main():
    numbers = read_number()
    print(numbers)
    for number in numbers:
        if number > 1:
            print("Geht")
            
if __name__ == "__main__":
    main()
_corn_
User
Beiträge: 27
Registriert: Montag 8. November 2021, 09:04

@all Vielen Dank für die gute Hilfe. Es funktioniert alles und ich habe es verstanden: Besser kann es nicht laufen. Lg und noch ein schönes Wochenende!
Antworten