是否有更快/更“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是否有任何方法可以利用我的列表中的所有字典具有相同的大小,以便使用快速跨式内存访问和一次复制大块数据,而无需将中间表示作为列表列表。
谢谢!
答案 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