这是我想要做的伪Python代码。
albums = map(
lambda album:
album + {
'url': get_url(album['id']),
'thumb': get_thumb(album['id']),
},
albums
)
...这是我目前难看的解决方案,它使用或在更新后返回对象。
albums = map(
lambda album:
album.update({
'url': get_url(album['id']),
'thumb': get_thumb(album['id']),
}) or album,
albums
)
答案 0 :(得分:4)
通常map
不适合在Python中使用,除非您正在应用的函数已经存在(例如内置函数,如int
或某个现有对象的方法)。如果您要编写lambda
以与map
一起使用,则应使用列表推导或显式for
循环。在您的情况下(您希望对列表中的词典进行就地修改),我认为for
循环是最佳的:
for album in albums:
album["url"] = get_url(album["id"])
album["thumb"] = get_thumb(album["id"])
答案 1 :(得分:1)
由于update
是一个就地操作,即它修改了你现有的dicts而不需要将结果赋给变量,你可以这样做:
albums = [
{'id': 111},
{'id': 222},
{'id': 333}
]
# Don't assign the result, just modify the existing albums object
map(lambda album:
album.update(
{'url': 'http://www.' + str(album['id']) + '.com'}
),
albums
)
结果:
albums
Out[3]:
[{'id': 111, 'url': 'http://www.111.com'},
{'id': 222, 'url': 'http://www.222.com'},
{'id': 333, 'url': 'http://www.333.com'}]
使用map
故意造成副作用虽然有点尴尬,所以更常规
for loop选项blckknight建议可能更有意义。
答案 2 :(得分:0)
我认为使用For loop
更具可读性。
for album in albums:
id = album['id']
newUrl, newThumb = get_url(id), get_thumb(id)
album.update({'url': newUrl, 'thumb': newThumb})
但是我一如既往地不知道什么是Pythonic ......