2017-12-01 3 views
0

ich meinen Code nur zu schreiben, um ein Datum (zB: iris.data) zu laden, so schreibe ich meinen Code wie folgt aus:Wörterbuch reduzieren Daten Python

data = [l.strip() for l in open('iris.data')] 
features = [tuple(map(float, x.split(',')[:-1])) for x in data] 
labels = [x.split(',')[-1] for x in data] 
zipped = zip(features, labels) 
return dict(zipped) 

aber eigentlich ich unangemessene dict Länge von Daten, wie dies gerade erhalten:

len(zipped) = 150 
len(dict) = 147 

Wie bekomme ich len(dict) entspricht len(zipped)?

+0

Indem Sie keine Duplikate in Ihren Daten haben. – Arne

Antwort

1

Versuchen Sie diese statt return dict(zipped):

ret = {} 
for key, val in zipped: 
    if key not in ret: 
     ret[key] = val 
    else: 
     print("Duplicate key: '%s'" % key) 
return ret 

Wie Sie aufgrund Duplikate um den Datenverlust zu handhaben wollen, dass auf Ihre Bedürfnisse ab. Vielleicht den Schlüssel umbenennen, um die Daten zu erhalten, vielleicht die Werte in eine Liste zu erweitern und zu akkumulieren statt zu ersetzen, vielleicht stellt sich heraus, dass es ok ist, doppelte Schlüssel zu ignorieren.

+0

Vielen Dank Herr! – ndutank

0

Sie haben Duplikate in Ihren Daten:

len(dict(zip(['k1', 'k2', 'k1'], ['v1', 'v2', 'v3']))) == 2 

Wenn Ihr Schlüssel Array nur den letzten Eintrag enthält Duplikat wird in der letzten dict sichtbar sein.

+0

Vielen Dank, jetzt weiß ich über das Konzept – ndutank

0

Der Schlüssel in einem Wörterbuch muss eindeutig sein. Zur Erweiterung auf Marcin Pietraszek des aswer:

dict(zip(['k1', 'k2', 'k1'], ['v1', 'v2', 'v3'])) 

zurückkehren wird:

{'k2' : 'v2', 'k1' : 'v3'} 

Vier der Werte in Ihrer Eigenschaften variabel sind die gleichen.