参见英文答案 > Getting a list of specific index items from a list of dictionaries in python (list comprehension) 5个
是否有更快/更“pythonic”的方式来访问与字典列表中的单个键相关联的值而不是循环它(如图所示here)?我正在寻找类似listDict [:] [‘id’]的东西来获取valules列表,但我得到的错误列表索引必须是整数,而不是str,即使listDict [0] [‘id’]工作得很好.
更新 – 后续问题:
如果键的值也是一个列表本身并且我只对获取它的前10个元素感兴趣怎么办?
当使用列表理解时,很容易为listDict中的dic做[dic [‘id’] [:10]],但是当使用itemgetter时呢? map(itemgetter(‘id’)[:10],listDict)似乎不起作用.
我问一个快速的访问方式,因为我有一个庞大的字典列表,我认为我可以获得与numpy数组相同的行为(就像切片只是原始数组的视图一样)用于字典列表.我想知道python是否有任何方法可以利用我的列表中的所有字典都具有相同的大小,以便使用快速跨式内存访问和一次复制大块数据而无需将中间表示作为列表列表.
谢谢!
解决方法:
不,你不能在这里切片.您循环遍历整个列表并从每个字典中获取项目.
使用列表理解:
[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
标签:python,list,dictionary,slice