Python:为字典键添加多个值
我想从csv文件中读取一系列值,按唯一键排列,然后对值进行一些计算。所以字典会让人浮想联翩 - 我可以获得第一个值,但是在将同一个键附加第二个值时遇到问题。Python:为字典键添加多个值
该键将是第一个条目;即三个字母,要存储的第一个值将是第2列和第3列中的值的累积相加,第二个要存储的值将是第3列的累积值。因此,基于以下文件,我希望词典阅读:
文件:
AAA,12.0,2
BBB,14.0,4
AAA,15.5,1
输出:
AAA:30.5,3
BBB:16.0,4
示例代码:
import csv
with open('input.csv') as csv_input:
read_csv = csv.reader(csv_input)
values = {}
for row in read_csv:
try:
values[row[0]] += float(row[1]) + float(row[2])
except KeyError:
try:
values[row[0]] = float(row[1]) + float(row[2])
#values.setdefault([row[0]]).append((row[2]))
except ValueError:
pass
print values
我试过使用.append但无法让它工作。任何意见或正确方向的提示将不胜感激。
根据你想要什么,你不是存储列表中,当你做 -
values[row[0]] = float(row[1]) + float(row[2])
你应该创建两个元素的列表,第一个元素是加row[1]
和row[2]
,第二个是row[2]
。
我也建议你可以在这里使用collections.defaultdict
,并提供一个函数,返回一个从0
开始的两个元素的列表。
示例 -
import csv
from collections import defaultdict
with open('input.csv') as csv_input:
read_csv = csv.reader(csv_input)
values = defaultdict(lambda : [0,0])
for row in read_csv:
values[row[0]][0] += float(row[1]) + float(row[2])
values[row[0]][1] += float(row[2])
print values
示例/演示 -
>>> import csv
>>> from collections import defaultdict
>>>
>>> with open('a.csv') as csv_input:
... read_csv = csv.reader(csv_input)
... values = defaultdict(lambda : [0,0])
... for row in read_csv:
... values[row[0]][0] += float(row[1]) + float(row[2])
... values[row[0]][1] += float(row[2])
...
>>> print(values)
defaultdict(<function <lambda> at 0x005B3B70>, {'AAA': [30.5, 3.0], 'BBB': [18.0, 4.0]})
谢谢Anand,非常感谢。 –
也感谢所有贡献的人。 –
很高兴我们会对您有所帮助。我还想要求您接受答案(通过点击答案左侧的勾号),答案是最有帮助的。 –
这样的事情?
import csv
with open('input.csv') as csv_input:
read_csv = csv.reader(csv_input)
values = {}
for row in read_csv:
key = row[0]
a = float(row[1]) + float(row[2])
b = float(row[2])
try:
values[key][0] += a
values[key][1] += b
except KeyError:
try:
values[key] = list(range(2))
values[key][0] = a
values[key][1] = b
except ValueError:
pass
print(values) # {'AAA': [30.5, 3.0], 'BBB': [18.0, 4.0]}
我建议使用一个collections.defaultdict
而不是常规字典:
from collections import defaultdict
import csv
sums = defaultdict(float)
with open('input.csv', 'rb') as input_file:
for row in csv.reader(input_file):
sums[row[0]] += sum(float(elem) for elem in row[1:])
print(sums) # -> defaultdict(<type 'float'>, {'AAA': 30.5, 'BBB': 18.0})
'值[行[0]] = values.get(行[0],[])追加(浮(row [1])+ float(row [2]))' – alfasin