热点通过某个键收集列表中的dict项目值?

时间:2014-09-04 13:56:22

标签: python list dictionary functional-programming

假设我们有一个dicts列表:

[
  {
    'k1': 'v11',
    'k2': 'v21',
    'k3': 'v31'
  },
  {
    'k1': 'v12',
    'k2': 'v22',
    'k3': 'v32'
  },
  {
    'k1': 'v13',
    'k2': 'v23',
    'k3': 'v33'
  }
]

我希望得到的所有值都是k1[v11, v12, v13],但是使用无循环

我尝试使用map函数和functools.partial

map(functools.partial(dict.get(), 'k1'), the_list)

但这是错误的,因为我只能使用functools.partial绑定第一个参数。

有没有任何pythonic方法可以做到这一点?

3 个答案:

答案 0 :(得分:6)

您可以operator.itemgetter使用map

>> from operator import itemgetter
>>> map(itemgetter('k1'), data)
['v11', 'v12', 'v13']

但是表现明智,它没有优于同等列表理解版本的优势:

>>> data = data *1000
>>> %timeit map(itemgetter('k1'), data)
10000 loops, best of 3: 170 µs per loop
>>> %timeit [x['k1'] for x in data]
10000 loops, best of 3: 166 µs per loop

答案 1 :(得分:2)

如果您想使用map执行此操作,请使用operator.itemgetter('k1')

map(operator.itemgetter('k1'), the_list)

我个人使用列表理解,但是:

[d['k1'] for d in the_list]

答案 2 :(得分:1)

您也可以使用lambda

map(lambda x:x.get('k1'), the_list)