2011-11-01 84 views

回答

54

「前n個」鍵不存在,因爲dict不記得先插入了哪些鍵。

你可以得到任何 n鍵 - 值對,但:

n_items = take(n, d.iteritems()) 

它使用的take實施從itertools recipes

from itertools import islice 

def take(n, iterable): 
    "Return first n items of the iterable as a list" 
    return list(islice(iterable, n)) 

看到它聯機工作:ideone

+6

我相信'iteritems'應該用'items'關於Python 3 –

8

Python的dict s沒有排序,所以請求「第一個N「鍵。

collections.OrderedDict類可用,如果這是你所需要的。你可以有效地得到它的前四個元素,如

import itertools 
import collections 

d = collections.OrderedDict((('foo', 'bar'), (1, 'a'), (2, 'b'), (3, 'c'), (4, 'd'))) 
x = itertools.islice(d.items(), 0, 4) 

for key, value in x: 
    print key, value 

itertools.islice讓您懶洋洋地採取任何迭代元素片。如果你想要得到的結果是可重複使用你需要將其轉換爲一個列表或東西,就像這樣:

x = list(itertools.islice(d.items(), 0, 4)) 
0

可以接近這個多種方式。如果訂單不是問題,你可以做到這一點

for key in sorted(d.keys()): 
    item = d.pop(key) 

for i in range(4): 
    item = d.popitem() 
+0

取代了人們在第一個片段你應該把它叫做'價值而不是「項目」。 – agf

3

PEP 0265分揀字典如果順序很重要,你可以做到這一點。然後使用前面提到的可迭代代碼。

如果在排序後的鍵值對中需要更高的效率。使用不同的數據結構。也就是說,維護排序順序和鍵值關聯。

E.g.

import bisect 

kvlist = [('a', 1), ('b', 2), ('c', 3), ('e', 5)] 
bisect.insort_left(kvlist, ('d', 4)) 

print kvlist # [('a', 1), ('b', 2), ('c', 3), ('d', 4), ('e', 5)] 
0

這取決於你的情況是什麼'最有效'。

如果您只是想要一個大型字典foo的半隨機樣本,請使用foo.iteritems(),並根據需要從中獲取儘可能多的值,這是一種懶惰操作,可避免創建明確的鍵或項目列表。

如果您需要首先對鍵進行排序,則無法使用類似keys = foo.keys(); keys.sort()sorted(foo.iterkeys())的東西,則必須構建明確的鍵列表。然後切片或遍歷第一個N keys

順便說一句爲什麼你關心'高效'的方式?你有沒有介紹你的計劃?如果沒有,首先使用明顯的易於理解的方式。它很可能會做得很好,而不會成爲瓶頸。

+0

這是一個財務程序的應用程序,我試圖儘可能高效地構建每一行代碼。我沒有介紹該計劃,並認爲這可能不是瓶頸,但我希望默認情況下要求有效的解決方案。謝謝回覆。 –

23

檢索任何東西的一種非常有效的方法是將列表或詞典解析與切片相結合。如果沒有需要訂購的物品(你只想n個隨機對),你可以使用字典的理解是這樣的:

# Python 2 
first2pairs = {k: mydict[k] for k in mydict.keys()[:2]} 
# Python 3 
first2pairs = {k: mydict[k] for k in list(mydict)[:2]} 

一般像這樣的理解總是更快地比等效運行「爲x in y「循環。此外,通過使用.keys()創建字典鍵列表並切分該列表,可避免在創建新字典時「觸及」任何不必要的鍵。

如果你不需要按鍵(僅值),可以使用列表理解:

first2vals = [v for v in mydict.values()[:2]] 

如果你需要根據自己的關鍵字排序的價值觀,這不是更麻煩:

first2vals = [mydict[k] for k in sorted(mydict.keys())[:2]] 

,或者如果您需要的按鍵,以及:

first2pairs = {k: mydict[k] for k in sorted(mydict.keys())[:2]} 
+0

這是一個更好的解決方案,如果你想選擇許多鍵:值對作爲字典,而不是列表 – fermat4214

+0

@ fermat4214這是一個問題,如果我的整個字典打印出來,當我運行這些命令中的任何一個? –

3

沒有看到它在這裏。如果您需要從字典中取出某些元素,將不會被排序,而是最簡單的語法。

n = 2 
{key:value for key,value in d.items()[0:n]} 
+2

我試過了你的代碼,但是我得到這個錯誤: 'TypeError:'dict_items'的對象不是可以下標的' '{key:value,value in stocks.items()[0:n]}'我的字典的名字) – Moondra

0

詞典沒有維護順序,因此在選擇前N個鍵值對之前,可以對其進行排序。

import operator 
d = {'a': 3, 'b': 2, 'c': 3, 'd': 4} 
d=dict(sorted(d.items(),key=operator.itemgetter(1),reverse=True)) 
#itemgetter(0)=sort by keys, itemgetter(1)=sort by values 

現在我們可以做頂「N」元素的檢索:,使用這樣的方法構造:

def return_top(elements,dictionary_element): 
    '''Takes the dictionary and the 'N' elements needed in return 
    ''' 
    topers={} 
    for h,i in enumerate(dictionary_element): 
     if h<elements: 
      topers.update({i:dictionary_element[i]}) 
    return topers 

讓高層2個元素則簡單地使用這樣的結構:

d = {'a': 3, 'b': 2, 'c': 3, 'd': 4} 
d=dict(sorted(d.items(),key=operator.itemgetter(1),reverse=True)) 
d=return_top(2,d) 
print(d) 
0
foo = {'a':1, 'b':2, 'c':3, 'd':4, 'e':5, 'f':6} 
iterator = iter(foo.items()) 
for i in range(3): 
    print(next(iterator)) 

基本上,將視圖(dict_items)轉換爲迭代器,然後用next()迭代它。

0

對於Python 3及以上的,要選擇第一N對

n=4 
firstNpairs = {k: Diction[k] for k in list(Diction.keys())[:n]}