4

是否有更快/更“pythonic”的方式来访问与字典列表中的单个键关联的值,而不是循环遍历它(如此处所示?我正在寻找类似listDict[:]['id']获取值列表的东西,但我得到了错误list indices must be integers, not str,即使listDict[0]['id']工作得很好。

更新 - 后续问题:如果键的值本身也是一个列表并且我只对获取它的前 10 个元素感兴趣怎么办?

使用列表推导时很容易做到[dic['id'][:10] for dic in listDict],但是使用时itemgetter呢?map(itemgetter('id')[:10], listDict)似乎不起作用。

我正在询问一种快速访问的方法,因为我有一个庞大的字典列表,并且我认为对于字典列表,我可以获得与 numpy 数组相同的行为(比如切片只是原始数组的视图)。我想知道python是否有任何方法可以利用我列表中的所有字典具有相同大小的事实来使用快速跨步内存访问并一次复制大块数据而不将中间表示作为列表列表。

谢谢!

4

1 回答 1

6

不,你不能在这里做这样的切片。您已经遍历整个列表并从每个字典中获取项目。

使用列表推导:

[dic['id'] for dic in listDict]

operator.itemgetter

>>> from operator import itemgetter
>>> map(itemgetter('id'), listDict)

时间比较:

>>> listDict = [{'id':1,'other':2},{'id':3,'other':4},{'id':5,'other':6}] *100

>>> %timeit [dic['id'] for dic in listDict]
10000 loops, best of 3: 50.8 us per loop
>>> %timeit map(itemgetter('id'), listDict)
10000 loops, best of 3: 42.7 us per loop

>>> listDict = [{'id':1,'other':2},{'id':3,'other':4},{'id':5,'other':6}]*1000

>>> %timeit [dic['id'] for dic in listDict]
1000 loops, best of 3: 446 us per loop
>>> %timeit map(itemgetter('id'), listDict)
1000 loops, best of 3: 440 us per loop

>>> listDict = [{'id':1,'other':2},{'id':3,'other':4},{'id':5,'other':6}] *10**5

>>> %timeit [dic['id'] for dic in listDict]
10 loops, best of 3: 50.7 ms per loop
>>> %timeit map(itemgetter('id'), listDict)
10 loops, best of 3: 45.6 ms per loop
于 2013-06-23T10:07:56.430 回答