访问字典列表(Python)中的项目以创建新的字典

时间:2015-06-23 23:34:49

标签: python python-2.7 dictionary

我有一本词典列表:

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。

2 个答案:

答案 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}