2016-11-15 65 views
0

我一直在试图为我的朋友解决问题。但是,这似乎是bug我,因为我无法映射两个文件中的键值。Python Dictonary - 两个文件 - 根据关键值乘以值/属性

问题描述:

第一个文件(sales.txt)的内容:

Apple 30 
Grape 90 
Cup 35 
Toy 100 
Apple 50 
Grape 51 
Toy 83 

第二个文件(price.txt)的内容:

Apple 1.3 
Grape 0.99 
Cup 1.5 
Toy 15 

的工作就是打印总价格。在这种情况下,我们需要打印3041.09。

我知道一个事实,即我们需要使用字典并根据关键字映射两个字典。因此,我根据自己的知识编写了代码。 (非常抱歉,如果它是愚蠢的!)

f = "sales.txt" 
d={} 
for line in open(f): 
    a=line.split() 
    key, values = str(a[0]), int(a[1]) 
    d.setdefault(key, []).append(int(values)) 
print(d) 

d = dict((key, sum(values)) for key, values in d.items()) 

print(d) 

g = "price.txt" 
dy={} 
for line in open(g): 
    b=line.split() 
    unit, price = str(b[0]), float(b[1]) 
    dy.setdefault(unit, []).append(float(price)) 
print(dy) 

total = 1.0 

for i in range(0, len(d)): 
    if d[key] == dy[unit]: 
     total = d.values*dy.price 

print(total) 

问题发生在条件,因为它没有进入循环。更正?

+0

,你永远不更新'key'或'unit' 。 – James

+0

你能简单解释一下吗? – HackersBusy

回答

0

,这在某种程度上使用第一循环的运行计数,只是总结在第二循环中总被简化:

with open("sales.txt") as f: 
    d = {} 
    for line in f: 
     key, value = line.split() 
     d[key] = d.get(key, 0) + int(value) 

with open("price.txt") as g: 
    total = sum(d[key] * float(price) for line in g for key, price in [line.split()]) 
print(total) 
#3041.09 
在过去的for循环
0

我没有运行代码,但它似乎当你做:

dy.setdefault(unit, []).append(float(price)) 

要添加到关键的数组,而不是一个标量 - >像苹果:[1.3],而不是苹果的:1.3

然后在最后一环,这样做

for item,count in d.items(): 
    total += count*dy[item] 
0

相反的:

total = 1.0 

for i in range(0, len(d)): 
    if d[key] == dy[unit]: 
     total = d.values*dy.price 

用途:

# the total should start at 0. 
total = 0.0 

for k in d: 
    total = total + d[k]*dy[k] 

这会遍历所有的键在d抢数量和价格,它们相乘并更新总。