将文件读入字典python

时间:2015-02-05 06:20:20

标签: python file dictionary

此功能用于将文件读入字典,使用鸟类名称键和权重作为值。它正在做我想要的但它没有经历所有的线,我不知道为什么!帮助一个女孩? 这是我的代码:

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] }

我不确定为什么

5 个答案:

答案 0 :(得分:1)

这是因为python的字典不能有重复的键。你正在使用'大写'方法,这使得一些鸟的名字相同。

答案 1 :(得分: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

答案 2 :(得分: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的预先存在的列表。

答案 3 :(得分:0)

Python dict中不能有多个具有相同值的键。

可以为每个实例添加一个整数,例如:

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]]}

或者,将append更改为extend以获取单位列表:

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]}

答案 4 :(得分: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)

快乐的拍打:)

编辑: 对不起忘了提到你现在应该把这个函数传递给一个打开的文件对象(或者我测试的字符串列表)