此功能用于将文件读入字典,使用鸟类名称键和权重作为值。它正在做我想要的但它没有经历所有的线,我不知道为什么!帮助一个女孩? 这是我的代码:
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 :(得分: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)
快乐的拍打:)
编辑: 对不起忘了提到你现在应该把这个函数传递给一个打开的文件对象(或者我测试的字符串列表)