bbu*_*scu 3 python dictionary list slice
是否有一个更快/更"Python化"的方式来访问关联到单个键的值比遍历它的其他词典列表(如图所示这里)?我正在寻找类似于listDict[:]['id']得到valules列表的东西,但我得到错误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是否有任何方法可以利用我的列表中的所有字典都具有相同的大小,以便使用快速跨式内存访问和一次复制大块数据而无需将中间表示作为列表列表.
谢谢!
不,你不能在这里切片.你循环遍历整个列表并从每个字典中获取项目.
使用列表理解:
[dic['id'] for dic in listDict]
Run Code Online (Sandbox Code Playgroud)
或者operator.itemgetter:
>>> from operator import itemgetter
>>> map(itemgetter('id'), listDict)
Run Code Online (Sandbox Code Playgroud)
时间比较:
>>> 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
Run Code Online (Sandbox Code Playgroud)