如何通过 python3 中的列表理解向字典列表添加属性?

sna*_*che 3 python list-comprehension python-3.x

我有一个字典列表。对于每个字典,我需要将其属性之一传递给函数,然后根据该函数的结果分配一个新属性。

例如:我有一个网站的页面列表。我需要循环遍历它们,并根据 URL 将作者姓名分配给字典中的属性。

for index, page in enumerate(pages):
    pages[index]['author'] = get_author(page['url'])
Run Code Online (Sandbox Code Playgroud)

这有效。但很混乱,而且感觉不像蟒蛇。pages[index]感觉像是我不应该在 Python 中做的事情。

有没有办法通过列表理解来做到这一点?或者其他一些更Pythonic的方式?

pages = [??? for page in pages]
Run Code Online (Sandbox Code Playgroud)

gmd*_*mds 6

您可以使用这样的list理解:

result = [{**page, 'author': get_author(page['url'])} 
          for page in pages]

# This works too:

result = [dict(**page, author=get_author(page['url'])) 
          for page in pages]

# but is less preferred because it will fail for input containing non-string keys
Run Code Online (Sandbox Code Playgroud)

这会根据应用于与该键对应的值的值,dict为每个原件创建dict一个带有额外键的新键。authorget_authorurl

请注意,它不会修改原始的list.

例子:

def get_author(i):
    if i == 1:
        return 'hello'

    else:
        return 'bye'

pages = [{'url': 1},
         {'url': 2}]

result = [{**page, **{'author': get_author(page['url'])}} for page in pages]
print(result)
Run Code Online (Sandbox Code Playgroud)

输出:

[{'url': 1, 'author': 'hello'}, {'url': 2, 'author': 'bye'}]
Run Code Online (Sandbox Code Playgroud)