我正在尝试在dict理解中创建多个键:值对,如下所示:
{'ID': (e[0]), 'post_author': (e[1]) for e in wp_users}
我收到了"missing ','"
我也是这样试过的:
[{'ID': (e[0]), 'post_author': (e[1])} for e in wp_users]
然后我收到"list indices must be integers, not str"
我理解,但不确定纠正此问题的最佳方法,以及是否可以使用dict理解来实现多个键:值对?
答案 0 :(得分:19)
字典理解每次迭代只能生成一个键值对。然后诀窍是产生一个额外的循环来分离出对:
{k: v for e in wp_users for k, v in zip(('ID', 'post_author'), e)}
这相当于:
result = {}
for e in wp_users:
for k, v in zip(('ID', 'post_author'), e):
result[k] = v
答案 1 :(得分:1)
我偶然遇到了这个老问题,我对被接受的答案并不信服。
什么使被接受的答案困扰?考虑一下:
>>> wp_users = [(1, 'Bill'), (2, 'Bob')]
>>> {k: v for e in wp_users for k, v in zip(('ID', 'post_author'), e)}
{'ID': 2, 'post_author': 'Bob'}
wp_users
,e = (1, 'Bill')
上的第一次迭代,字典为{'ID':1, 'post_author': 'Bill'}
wp_users
,e = (2, 'Bob')
上进行第二次迭代,将字典完全覆盖到{'ID':2, 'post_author': 'Bob'}
在每次迭代中,字典的所有值都将被覆盖。您可以避免循环并直接跳到wp_users
的最后一个元素:
>>> {k: v for e in wp_users for k, v in zip(('ID', 'post_author'), e)}
{'ID': 2, 'post_author': 'Bob'}
或者:
>>> dict(zip(('ID', 'post_author'), wp_users[-1]))
{'ID': 2, 'post_author': 'Bob'}
我认为那不是你想要的。
您要实现的目标仍然不清楚,但是我看到两个选择:您有一个用户列表(id, post_author)
,并且想要创建一个字典列表(每个用户一个字典)或一个元组字典(每个字段一个元组)。您可以将第一个版本显示为按行显示,第二个版本显示为相同数据的列。
尝试一下:
>>> [dict(zip(('ID', 'post_author'), user)) for user in wp_users]
[{'ID': 1, 'post_author': 'Bill'}, {'ID': 2, 'post_author': 'Bob'}]
对于每个user
,zip
将创建元组('ID', id)
,('post_author', author)
和dict
将生成字典。现在,您可以访问类似的字段:
>>> ds = [dict(zip(('ID', 'post_author'), user)) for user in wp_users]
>>> ds[0]['post_author']
'Bill'
这很不常见,但是您可能想要一本以元组为值的字典:
>>> dict(zip(('ID', 'post_author'), zip(*wp_users)))
{'ID': (1, 2), 'post_author': ('Bill', 'Bob')}
zip(*wp_users)
只需创建一个元组[(id1, id2, ...), (post_author1, post_author2, ...)]
的列表,其余与以前的版本相似。
>>> d = dict(zip(('ID', 'post_author'), zip(*wp_users)))
>>> d['post_author'][0]
'Bill'
要从线视图中提取列,请执行以下操作:
>>> [d['ID'] for d in ds]
[1, 2]
要从列视图中提取一行,
>>> {k:vs[1] for k, vs in d.items()}
{'ID': 2, 'post_author': 'Bob'}
答案 2 :(得分:0)
我认为您的问题是第二个版本正在创建列表字典,而不仅仅是一个字典。您正在尝试使用字符串访问列表,这会引发错误:
>>> obj = [{'data1': 67, 'data2': 78}]
>>> obj[0]['data1']
67
>>> obj['data1']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: list indices must be integers, not str
>>>
相反,只需将第二个版本作为`wp_list [0] ['post_author']访问,它应该可以正常工作:
>>> wp_users = ('Bob', 'Joe', 'Sally')
>>> wp_list = [{'ID': (e[0]), 'post_author': (e[1])} for e in wp_users]
>>> wp_list[0]['post_author']
'o'
>>> wp_list[1]['post_author']
'o'
>>> wp_list[2]['post_author']
'a'
>>>