我有一本词典列表:
my_dict = {0: [{'distance': 2.1, 'home_id': 2L, 'home_number': 4, 'road_id': 0},
{'distance': 4.1, 'home_id': 1L, 'home_number': 2, 'road_id': 0}],
1: [{'distance': 4, 'home_id': 3L, 'home_number': 5, 'road_id': 1}],
2: [{'distance': 2.1, 'home_id': 4L, 'home_number': 1, 'road_id': 2},
{'distance': 6, 'home_id': 5L, 'home_number': 3, 'road_id': 2}]}
我怎样才能:
final_dict = {1L : {1 : 2}, 2L : {1 : 4}, 3L : {1 : 5}, 4L : {1 : 1}, 5L : {1 : 3}}
1是我想要更新的字段的索引(使用每个内部字典的值)。这些项目中的每一项都有一个ID,它是final_dict的关键。
到目前为止我尝试过:
new_sort_attr = {}
for key,value in my_dict:
for dictionary in value:
new_sort_attr[dictionary['home_id']] = dictionary['home_number']
这给了我一个TypeError。
答案 0 :(得分:1)
你可以这样做
my_dict = {0: [{'distance': 2.1, 'home_id': 2L, 'home_number': 4, 'road_id': 0},
{'distance': 4.1, 'home_id': 1L, 'home_number': 2, 'road_id': 0}],
1: [{'distance': 4, 'home_id': 3L, 'home_number': 5, 'road_id': 1}],
2: [{'distance': 2.1, 'home_id': 4L, 'home_number': 1, 'road_id': 2},
{'distance': 6, 'home_id': 5L, 'home_number': 3, 'road_id': 2}]}
final_dict = {1L : {1 : 2}, 2L : {1 : 4}, 3L : {1 : 5}, 4L : {1 : 1}, 5L : {1 : 3}}
# without dict comprehension
dout = {}
for k, v in my_dict.iteritems():
for d in v:
dout[d['home_id']] = {1: d['home_number']}
# using dict comprehension
dout2 = {d['home_id']: {1: d['home_number']} for k, v in my_dict.iteritems() for d in v}
print final_dict
print dout
print dout2
输出
{1L: {1: 2}, 2L: {1: 4}, 3L: {1: 5}, 4L: {1: 1}, 5L: {1: 3}}
{1L: {1: 2}, 2L: {1: 4}, 3L: {1: 5}, 4L: {1: 1}, 5L: {1: 3}}
{1L: {1: 2}, 2L: {1: 4}, 3L: {1: 5}, 4L: {1: 1}, 5L: {1: 3}}
有两种方法,基本上是等价的,但有些人喜欢一种衬里,而另一种方法则认为嵌套的理解使得行太长,代码可读性也差。
您的代码中缺少的是您错误地迭代了dict(这将是一个例外)。你应该使用iteritems
(python 2)或items
(python 3)从dict中产生键值对。
如果你想坚持直接迭代dict,你必须做类似的事情
new_sort_attr = {}
for d in my_dict:
for din in my_dict[d]:
new_sort_attr[din['home_id']] = {1: din['home_number']}
其次你从未创建过子词典。而不是
new_sort_attr[dictionary['home_id']] = dictionary['home_number']
我做了
dout[d['home_id']] = {1: d['home_number']}
答案 1 :(得分:0)
类型错误来自迭代时语法错误。 迭代dict时,你得到了密钥。而不是
for key,value in my_dict:
你应该
for key,value in my_dict.items():
给你
{1L: 2, 2L: 4, 3L: 5, 4L: 1, 5L: 3}