我有一本这样的字典,有成千上万的键比显示的多,每个字母a
、b
、c
都有数百个值:
dictex = {'cat': {'a': [[1, 3, 5], [2, 2, 7]], 'b': [[1, 3, 7], [2, 2, 7]], 'c': [[1, 2, 7], [2, 2, 7]]},
'dog': {'a': [[1, 2, 5], [2, 2, 7]], 'b': [[1, 2, 7], [2, 2, 7]], 'c': [[1, 3, 7], [2, 2, 7]]},
'moose': {'a': [[1, 1, 5], [2, 2, 7]], 'b': [[1, 1, 7], [2, 2, 7]], 'c': [[1, 1, 7], [2, 2, 7]]}}
我想为每个条目从第二个值中减去第一个值,并对所有a
、所有b
和所有c
进行求和。例如,对于cat
条目的a
,操作是(5-3) + (7-2)。首选输出是(.csv):
animal a b c
cat 7 9 10
dog 8 10 9
moose 9 11 11
我可以得到一个特定的动物和字母的差异使用
dictex['cat']['a'][0][2] - dictex['cat']['a'][0][1]`
output:
2
我不知道如何以一种不需要大量手工输入的智能方式来获取每个条目,然后将其输出到上面的表单中。
发布于 2018-11-27 22:11:58
如果您可以使用这个库,可以用pandas
轻松地编写它。
通常,将列表放入dataframes并不是一个好主意,但是我们只做一些轻微的处理,然后将结果保存到csv文件中。
pd.DataFrame(dictex).rename_axis('animal', 1).applymap(lambda lists: sum(l[2]-l[1] for l in lists)).T.to_csv('f.csv')
这将导致文件
animal,a,b,c
cat,7,9,10
dog,8,10,9
moose,9,11,11
发布于 2018-11-27 22:04:16
您可以定义一个单独的方法来获取列表中所有列表的第二个和第一个元素之间的所有差异之和,然后使用“字典理解”生成result
:
def diff_sums(l):
return sum(x[2] - x[1] for x in l)
dictex = {'cat': {'a': [[1, 3, 5], [2, 2, 7]], 'b': [[1, 3, 7], [2, 2, 7]], 'c': [[1, 2, 7], [2, 2, 7]]},
'dog': {'a': [[1, 2, 5], [2, 2, 7]], 'b': [[1, 2, 7], [2, 2, 7]], 'c': [[1, 3, 7], [2, 2, 7]]},
'moose': {'a': [[1, 1, 5], [2, 2, 7]], 'b': [[1, 1, 7], [2, 2, 7]], 'c': [[1, 1, 7], [2, 2, 7]]}}
result = {animal: {k: diff_sums(v) for k, v in num_lists.items()} for animal, num_lists in dictex.items()}
print(result)
输出
{'cat': {'a': 7, 'b': 9, 'c': 10},
'dog': {'a': 8, 'b': 10, 'c': 9},
'moose': {'a': 9, 'b': 11, 'c': 11}}
要将其写入CSV文件,可以使用csv
模块:
import csv
columns = ['animal', 'a', 'b', 'c']
data = [[animal] + [v[c] for c in columns[1:]] for animal, v in result.items()]
with open('mydata.csv', 'w') as csvfile:
writer = csv.writer(csvfile, delimiter=',')
for line in [columns] + data:
writer.writerow(line)
输出
animal,a,b,c
cat,7,9,10
dog,8,10,9
moose,9,11,11
发布于 2018-11-27 22:23:28
如果您发现自己不得不一遍又一遍地进行某种计算,那么编写函数可能是最好的方法。下面是一个函数,它接受像dictex、动物名和字母这样的字典,并为您返回单独的计算:
# Do the calculations for a particular animal and letter
def calculate_value(mydict, animal, letter):
W = mydict[animal][letter][0][2]
X = mydict[animal][letter][0][1]
Y = mydict[animal][letter][1][2]
Z = mydict[animal][letter][1][1]
# Do the math and convert the resulting number to a string,
# which will save us some headaches when writing to the csv file.
return str((W-X) + (Y-Z))
下面是一个函数,它遍历整个字典,计算每个动物和字母的值,然后在如下列表中返回结果:[ ['cat',7,9,10], ['dog',8,10,9], ... ]
等。
def make_new_list(my_dict):
new_list = []
for animal in my_dict:
individual_animal_list = [animal]
for letter in ['a', 'b', 'c']:
individual_animal_list.append(calculate_value(my_dict, animal, letter))
new_list.append(individual_animal_list)
return new_list
我之所以使用上述格式,是因为它使将结果写入csv文件变得更加容易。只需将从前一个函数中获得的每个列表,将所有内容与中间的逗号连接起来,并将其作为一行写入文件:
dictex = {'cat': {'a': [[1, 3, 5], [2, 2, 7]], 'b': [[1, 3, 7], [2, 2, 7]], 'c': [[1, 2, 7], [2, 2, 7]]},
'dog': {'a': [[1, 2, 5], [2, 2, 7]], 'b': [[1, 2, 7], [2, 2, 7]], 'c': [[1, 3, 7], [2, 2, 7]]},
'moose': {'a': [[1, 1, 5], [2, 2, 7]], 'b': [[1, 1, 7], [2, 2, 7]], 'c': [[1, 1, 7], [2, 2, 7]]}}
new_list = make_new_list(dictex)
with open('my_file.csv', 'w') as f:
f.write('animal,a,b,c\n') # Write the header line
for row in new_list:
f.write(','.join(row))
f.write('\n')
请记住,Python中的字典是没有排序的。因此,您的结果文件不一定会让您的动物行按照它们在原始字典中出现的相同顺序排列。
https://stackoverflow.com/questions/53508765
复制相似问题