【问题标题】:How do I extract all the values of a specific key from a list of dictionaries?如何从字典列表中提取特定键的所有值?
【发布时间】:2014-08-05 21:25:44
【问题描述】:

我有一个字典列表,它们在列表中都具有相同的结构。例如:

test_data = [{'id':1, 'value':'one'}, {'id':2, 'value':'two'}, {'id':3, 'value':'three'}]

我想从列表中的每个字典中获取每个 value 项:

['one', 'two', 'three']

我当然可以遍历列表并使用 for 循环提取每个值:

results = []
for item in test_data:
    results.append(item['value'])

但是我的数据集非常大。我想知道是否有更快的方法。

【问题讨论】:

  • 我无法想象它会变得比这快得多。您正在查看每本字典一次,并且字典可以立即查找。如果您想在很大程度上提高速度,您可能需要更改为不同的结构。
  • 列表理解应该稍微快一些。

标签: python list dictionary


【解决方案1】:

如果您只需要迭代一次值,请使用生成器表达式:

generator = ( item['value'] for item in test_data )

...

for i in generator:
    do_something(i)

另一个(深奥的)选项可能是使用 mapitemgetter - 它可能比生成器表达式稍快,也可能不快,具体取决于具体情况:

from operator import itemgetter

generator = map(itemgetter('value'), test_data)

如果你绝对需要一个列表,列表推导比迭代 list.append 更快,因此:

results = [ item['value'] for item in test_data ]

【讨论】:

  • 在大多数情况下我会使用生成器,但我相信我需要整个列表。我将尝试列表推导,看看是否能加快速度。
【解决方案2】:

你可以这样做:

result = map (lambda x:x['value'],test_data)

【讨论】:

    【解决方案3】:

    如果你的数据真的很大,generator 会更高效:

    list((object['value'] for object in test_data))
    

    例如:

    >>> list((object['value'] for object in test_data))
    ['one', 'two', 'three']
    

    生成器部分是这样的:

    (object['value'] for object in test_data)
    

    通过将其包装在 list() 中,您可以耗尽生成器并在数组中很好地返回其值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-24
      • 1970-01-01
      • 2020-11-10
      • 2018-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多