Hallo,
ich habe eine Liste von Tupeln die Ganzzahlen enthält, diese soll als Input für hashlib.update dienen, der will bekanntlich aber nur Strings.
Wie löse ich das am besten?
Listen von Tupeln als Input für hashlib.update
wie wäre es mit:
Code: Alles auswählen
str(liste[0]) , str(liste[1])...
Ich bin mir nicht sicher ob du das meinst, aber:
Code: Alles auswählen
>>> a
(10, 20, 30, 40)
>>> "".join(str(b) for b in a)
'10203040'
Verwendbar wäre das, aber nicht unbedingt elegant.
Zum meinem Verwendungszweck:
Ich habe Bilder gegeben deren Daten als RGB-Tupel-Liste vorliegen und ich will die Hashwerte in einem Dictionary ablegen um Duplikate herauszufiltern. Zum. sieht so der naive Ansatz aus.
Wäre also sicher ganz angebracht, wenn die zu hashende Datenmenge nicht noch zus. wachsen würde.
Zum meinem Verwendungszweck:
Ich habe Bilder gegeben deren Daten als RGB-Tupel-Liste vorliegen und ich will die Hashwerte in einem Dictionary ablegen um Duplikate herauszufiltern. Zum. sieht so der naive Ansatz aus.
Wäre also sicher ganz angebracht, wenn die zu hashende Datenmenge nicht noch zus. wachsen würde.
@darktrym: Suchst Du dann nicht einfach folgendes?
Code: Alles auswählen
>>> rgbs = [(255,0,0),(255,0,0)]
>>> list(set(rgbs))
[(255, 0, 0)]
Bin wohl geistig nicht mehr ganz so frisch. Ich denke mir würde eine Lösung wie eine verschachtelte Schleife, bei den ich die einzelnen Tupelwerte in Strings umwandeln und an update übergebe als Einzeiler genügen.
So, ich geh' jetzt Schafe zählen.
So, ich geh' jetzt Schafe zählen.
Du willst also zwei Bilder vergleichen (um duplikate zu finden), die in diesem Format vorliegen?:
Wieso vergleichst du nicht einfach die Listen direkt miteinander? `image_one == image_two`
Code: Alles auswählen
[(R, G, B, A), (R, G, B, A), …]
the more they change the more they stay the same
Weil das unglaublich langsam ist, wenn man eine genügend große Anzahl von Bildern hat, welche man alle paarweise miteinander vergleichen möchte. Wenn man nur die Hashwerte überprüft fällt hingegen fast gar keine Rechenzeit an.Dav1d hat geschrieben:Wieso vergleichst du nicht einfach die Listen direkt miteinander? `image_one == image_two`
Zum Hashwert an sich: Vielleicht reicht auch ein Umwandeln deiner Liste in ein Tupel, dann hast du die built-in-hash-Funktion zur Verfügung:
Code: Alles auswählen
hash(tuple([(R, G, B, A), (R, G, B, A), …]))
Das Leben ist wie ein Tennisball.
Stimmt, ich ging von einmaligem vergleichen aus.EyDu hat geschrieben:Weil das unglaublich langsam ist, wenn man eine genügend große Anzahl von Bildern hat, welche man alle paarweise miteinander vergleichen möchte. Wenn man nur die Hashwerte überprüft fällt hingegen fast gar keine Rechenzeit an.
the more they change the more they stay the same
Der könnte sich auch schon zwischen Interpreter Sessions ändern um (D)DOS Attacken über Hash Kollisionen zu vermeiden.EyDu hat geschrieben:Wenn ich mich richtig erinnere, dann sollte man den so erzeugten Hashwert jedoch nicht abspeichern, da dieser sich von Pythonversion zu Version unterscheiden kann. Vielleicht liege ich aber auch falsch und jemand möge mich korrigieren.
Wenn alles Gesagte ein Problem darstellt, wie wärs mit einer eigenen Hashfunktion über die RGBA-Werte?
Ist zugegeben ein Schnellschuss, vllt. aber mit einigen Anpassungen interpreter- und sessionübergreifend nutzbar.
Code: Alles auswählen
hash = lambda t: ''.join(chr(i) for i in t)