我无意中发现了这个旧问题,但我对被接受的答案并不满意。
被接受的答案
被接受的答案有什么令人不安的地方?请考虑以下内容:
>>> 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'}
wp_users
是哪种类型? - RodrigoOlmoe[0]
周围的括号是无用的。 - Ericwp_users_list ['post_author']
是当我得到“列表索引必须是整数,而不是str”时。 - mdxprogramswp_users_list[0]['post_author']
。 - salparadise