我偶然遇到了这个老问题,我不相信接受的答案。
接受的答案
接受的答案有什么令人不安的地方?考虑一下:
>>> 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')
, dict 是{'ID':1, 'post_author': 'Bill'}
- 第二次迭代
wp_users
, e = (2, 'Bob')
, dict 被完全覆盖为{'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'}