dict理解中的多对键值对

2024-05-19 01:44:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图在dict理解中创建多个key:value对,如下所示:

{'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"

我明白,但不确定最好的方法来纠正这个问题,如果多个键:值对听写理解是可能的?


Tags: keyinidforvaluepostusersdict
3条回答

字典理解每次迭代只能产生一个键值对。接下来的诀窍是产生一个额外的循环来分离两对:

{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

我偶然碰到这个老问题,我不相信这个公认的答案。

接受的答案

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

>>> 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_userse = (1, 'Bill'),dict是{'ID':1, 'post_author': 'Bill'}
  • wp_userse = (2, 'Bob')上的第二次迭代,dict被完全覆盖到{'ID':2, 'post_author': 'Bob'}

在每次迭代中,都会覆盖dictional的所有值。您可以避免循环并直接跳到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)或一个元组字典(每个字段一个元组)。您可以将第一个版本按行显示为演示文稿,而将第二个版本按相同数据的列显示为演示文稿。

词典目录

试试这个:

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

对于每个userzip将创建元组('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'}

我认为你的问题是第二个版本创建了一个字典列表,而不仅仅是一个字典。您正试图使用字符串访问列表,这会引发错误:

>>> 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'
>>> 

相关问题 更多 >

    热门问题