2013-06-23 56 views
3

是否有更快的/更「pythonic」的方式來訪問與字符串列表中的單個鍵相關聯的值(如圖所示here)?我正在尋找像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是否有任何方法利用這樣一個事實,即我的列表中的所有字典都具有相同的大小,以便使用快速跨越的內存訪問和一次性複製大塊數據,而不需要將中間表示形式作爲列表列表。

謝謝!

+0

對不起,這是你給的鏈接問題的副本,所有的有同樣的答案 – jamylak

+0

我知道給這個問題的答案,我是有興趣的話,如果有其他_other_替代品。 – bbudescu

+0

最pythonic和最快的解決方案是那裏接受的答案 – jamylak

回答

4

不,你不能在這裏做切片。您已經遍歷整個列表並從每個字典中獲取項目。

使用列表理解:

[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 
+0

'map''itemgetter'比你第一個給出的解決方案更慢,更醜陋 – jamylak

+0

@jamylak事實證明它更快。 –

+0

不在小列表中,差異可以忽略不計 – jamylak