dict理解中的多个键值对

mdx*_*ams 18 python dictionary dictionary-comprehension

我试图在dict理解中创建多个键:值对,如下所示:

{'ID': (e[0]), 'post_author': (e[1]) for e in wp_users}
Run Code Online (Sandbox Code Playgroud)

我收到了 "missing ','"

我也这样试过:

[{'ID': (e[0]), 'post_author': (e[1])} for e in wp_users]
Run Code Online (Sandbox Code Playgroud)

然后我收到了 "list indices must be integers, not str"

我理解,但不确定纠正这个的最佳方法,如果多个键:值对可以用dict理解吗?

Mar*_*ers 19

字典理解每次迭代只能产生一个键值对.然后诀窍是产生一个额外的循环来分离出对:

{k: v for e in wp_users for k, v in zip(('ID', 'post_author'), e)}
Run Code Online (Sandbox Code Playgroud)

这相当于:

result = {}
for e in wp_users:
    for k, v in zip(('ID', 'post_author'), e):
        result[k] = v
Run Code Online (Sandbox Code Playgroud)


jfe*_*ard 13

我偶然遇到了这个老问题,我不相信接受的答案。

接受的答案

接受的答案有什么令人不安的?考虑一下:

>>> 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'}
Run Code Online (Sandbox Code Playgroud)
  • 第一次迭代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'}
Run Code Online (Sandbox Code Playgroud)

或者:

>>> dict(zip(('ID', 'post_author'), wp_users[-1]))
{'ID': 2, 'post_author': 'Bob'}
Run Code Online (Sandbox Code Playgroud)

我认为这不是你想要的。

您想要实现的目标仍不清楚,但我看到两个选项:您有一个用户列表,(id, post_author)并且您想要创建一个字典列表(每个用户一个字典)或一个元组字典(每个字段一个元组)。您可以将第一个版本视为按行进行的演示,而将第二个版本视为按相同数据的列进行的演示。

字典列表

尝试这个:

>>> [dict(zip(('ID', 'post_author'), user)) for user in wp_users]
[{'ID': 1, 'post_author': 'Bill'}, {'ID': 2, 'post_author': 'Bob'}]
Run Code Online (Sandbox Code Playgroud)

对于每一个userzip将创建的元组('ID', id)('post_author', author)dict将产生的字典。现在您可以访问这样的字段:

>>> ds = [dict(zip(('ID', 'post_author'), user)) for user in wp_users]
>>> ds[0]['post_author']
'Bill'
Run Code Online (Sandbox Code Playgroud)

元组字典

这更不寻常,但您可能想要一本值为元组的字典:

>>> dict(zip(('ID', 'post_author'), zip(*wp_users)))
{'ID': (1, 2), 'post_author': ('Bill', 'Bob')}
Run Code Online (Sandbox Code Playgroud)

zip(*wp_users)简单地创建一个元组列表,[(id1, id2, ...), (post_author1, post_author2, ...)]其余的类似于以前的版本。

>>> d = dict(zip(('ID', 'post_author'), zip(*wp_users)))
>>> d['post_author'][0]
'Bill'
Run Code Online (Sandbox Code Playgroud)

奖金

从线视图中提取一列:

>>> [d['ID'] for d in ds]
[1, 2]
Run Code Online (Sandbox Code Playgroud)

要从列视图中提取一行:

>>> {k:vs[1] for k, vs in d.items()}
{'ID': 2, 'post_author': 'Bob'}
Run Code Online (Sandbox Code Playgroud)

  • 看,这就是缺乏适当 [mcve] 的问题的麻烦,你并不总是看到输入对于他们所问的内容没有意义。确实,我们还不清楚输出的 OP 是什么。 (4认同)