2015-02-05 112 views
1

該函數旨在將文件讀入字典中,使用birdnames a keys和權值作爲值。它正在做我想要的,但它不是通過所有的線路,我不知道爲什麼!幫助一個女孩出去? 這裏是我的代碼:將文件讀入字典python

def bird_weights(filename): 
    bird_dict = {} 
    f = open(filename, "r") 
    for line in f: 
     new_line = line.split(":") 
     bird_type = new_line[0].capitalize() 
     bird_weight = new_line[1].strip().split(' ') 
     bw_list = [float(i) for i in bird_weight] 
     bird_dict[bird_type] = bw_list 
     if bird_type in bird_dict: 
      bird_dict[bird_type].extend(bw_list) 
     else: 
      bird_dict[bird_type] = bw_list 

    return bird_dict 

.txt文件是:

bluebird:78.3 89.3 77.0 
TANAGER: 111.9 107.65 
BlueBird: 69.9 
bluebirD: 91.9 
tanager: 108.0 110.0 

和代碼是爲了產生

{"Bluebird":[78.3, 89.3, 77.0, 69.9, 91.9],"Tanager": [111.9, 107.65, 108.0, 110.0]} 

什麼,我得到的是:

{"Bluebird":[91.9, 91.9], "Tanager": [108.0, 110.0, 108.0, 110.0] } 

我不確定爲什麼

+0

@eumiro雅我修正了我的想法。它被更新。 –

回答

0

每當你看到Bluebird時,你都在覆蓋已經存在的東西。嘗試是這樣的:

for line in f: 
    ... 
    if bird_type in bird_dict: 
     bird_dict[bird_type].extend(bw_list) 
    else: 
     bird_dict[bird_type] = bw_list 

添加到一個預先存在的列表中爲每個bird_type

+0

什麼是bw_list? –

+0

您的原始代碼中的鳥重量列表。 –

+0

我更新了我的代碼和結果。這是不正確的:/ –

1

這是因爲python的字典不能有重複的鍵。你正在使用'大寫'方法,這使得一些鳥的名字相同。

1
def bird_weights(filename): 
    result = collections.defaultdict(list) 

    with open(filename, 'r') as f: 
     for line in f.readlines(): 
      bird_name, values = line.strip().split(':') 

      # normalization 
      bird_name = bird_name.strip().capitalize() 
      values = map(lambda v: float(v.strip()), values.strip().split(' ')) 

      result[bird_name].extend(values) 

    return result 
+1

默認字典是非常優雅的東西。 –

+0

lower()是不需要的,如果你正在調用大寫() – helloV

+0

謝謝@ helloV,我已經更新了我的答案。 – ozgur

0

在Python字典中不能有多個具有相同值的鍵。

可以整數添加到每個實例如:

keys={} 
birds={} 
with open(file) as f: 
    for line in f: 
     k,_,v=line.partition(':') 
     k=k.capitalize() 
     v=map(float, v.split()) 
     keys[k]=keys.setdefault(k, 0)+1 
     birds.setdefault('{} {}'.format(k, keys[k]), []).extend(v) 


{'Tanager 1': [111.9, 107.65], 
'Tanager 2': [108.0, 110.0], 
'Bluebird 3': [91.9], 
'Bluebird 2': [69.9], 
'Bluebird 1': [78.3, 89.3, 77.0]} 

或者,使用列表這種結構的列表:

birds={} 
with open(file) as f: 
    for line in f: 
     k,_,v=line.partition(':') 
     k=k.capitalize() 
     v=map(float, v.split()) 
     birds.setdefault(k, []).append(v) 

{'Bluebird': [[78.3, 89.3, 77.0], [69.9], [91.9]], 
'Tanager': [[111.9, 107.65], [108.0, 110.0]]} 

或者改變appendextend了平面列表:

birds={} 
with open(file) as f: 
    for line in f: 
     k,_,v=line.partition(':') 
     k=k.capitalize() 
     v=map(float, v.split()) 
     birds.setdefault(k, []).extend(v) 

{'Bluebird': [78.3, 89.3, 77.0, 69.9, 91.9], 'Tanager': [111.9, 107.65, 108.0, 110.0]} 
0

所以我知道已經有很多解決方案,但我只會發佈一個:)

如果你想使你的生活更容易一點,不想讓你的代碼感到困惑所以很容易,它有時有助於實現不是最短但最可讀的解決方案。如果你現在只有一半的時間瞭解你的行爲,那麼當你試圖改變這段代碼片段時,你會在將來半年遇到困難。

因此,這裏是我的相當傳神的解決方案,我想你就可以確切地瞭解什麼,當你通過你的bird_weights()功能閱讀我所做的:

class Bird(object): 
    def __init__(self, name, weights): 
     self.name = name 
     self.weights = weights 

    def __str__(self): 
     return self.name + ':' + str(self.weights) 

def get_float_list(weights): 
    return [float(i.strip()) for i in weights.strip().split(' ')] 

def print_birds(birdlist): 
    print '{' 
    for i in birdlist: 
     print str(i) + ',' 
    print '}' 

def bird_weights(f): 
    birdlist = [] 
    for line in f: 
     name, weights = line.split(':') 
     birdy = Bird(name.capitalize(), get_float_list(weights)) 
     birdlist.append(birdy) 
    print_birds(birdlist) 

撲快樂:)

編輯: 對不起忘了提及,你應該現在傳遞一個打開的文件對象(或一串字符串,如我爲測試)此功能