词典列表中的切片

时间:2013-06-23 10:06:28

标签: python list dictionary slice

是否有更快/更“pythonic”的方式来访问与字典列表中的单个键相关联的值,而不是循环遍历它(如here所示)?我正在寻找类似listDict[:]['id']的内容来获取valule列表,但我收到错误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是否有任何方法可以利用我的列表中的所有字典具有相同的大小,以便使用快速跨式内存访问和一次复制大块数据,而无需将中间表示作为列表列表。

谢谢!

1 个答案:

答案 0 :(得分:5)

不,你不能在这里做切片。你循环遍历整个列表并从每个字典中获取项目。

使用列表理解:

[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