映射处理字典列表的Pythonic方法是什么?

时间:2014-06-25 01:03:42

标签: python dictionary map

这是我想要做的伪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
)

3 个答案:

答案 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 ......