2010-11-03 75 views
9

從迭代中創建字典併爲其分配默認值的最簡單方法是什麼?我想:從迭代中創建字典

>>> x = dict(zip(range(0, 10), range(0))) 

但我認爲這不會是不工作,因爲範圍(0)不是一個迭代

那麼,如何去了解它(但我想反正!) ?如果我這樣做:

>>> x = dict(zip(range(0, 10), 0)) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: zip argument #2 must support iteration 

這也行不通。有什麼建議麼?

+0

不知道有足夠的瞭解您所使用的字典的,但如果相關的值從來沒有真正用於任何東西,可以考慮使用一個Python'set'而不是'dict'。有了它,你可以說'x = set(range(10))'。 – martineau 2010-11-05 02:25:43

回答

15

您需要dict.fromkeys方法,它完全符合您的要求。

從文檔:

fromkeys(...) 
    dict.fromkeys(S[,v]) -> New dict with keys from S and values equal to v. 
    v defaults to None. 

所以,你需要的是:

>>> x = dict.fromkeys(range(0, 10), 0) 
>>> x 
{0: 0, 1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0, 7: 0, 8: 0, 9: 0} 
+0

謝謝,完美,很容易。 – user225312 2010-11-03 06:58:46

+0

假設我想要的值等於來自某個列表的條目,而不是一個常數值。怎麼做?像這樣:'{0:y [0],1:y [1],...}'其中'y'是一個列表。 – Sigur 2017-05-24 22:53:13

2

低俗小說給出了切實可行的辦法來做到這一點。但只是爲了興趣,你可以重複0

x = dict(zip(range(0, 10), itertools.repeat(0))) 
+0

這也不錯。 – user225312 2010-11-03 06:57:50

+0

+1。這很棒。 – user225312 2010-11-03 07:10:35

+0

其實你不需要'itertools' - 這將使用'iter()'內置的相同的東西:'dict(zip(range(0,10),iter(lambda:0,None))) '或甚至只是如果默認值是一個值爲'0'的int:'dict(zip(range(0,10),iter(int,None)))''。 – martineau 2010-11-03 10:40:11

12

在Python 3,你可以使用字典理解讓您的解決方案的工作,通過使用itertools.repeat

>>> {i:0 for i in range(0,10)} 
{0: 0, 1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0, 7: 0, 8: 0, 9: 0} 

幸運的是,這已被回溯到python 2.7中,所以在那裏也可用。

+0

我沒有倒下你,但回答你的問題,「不」。 – martineau 2010-11-03 10:32:32

+0

(upvoted)是的,他做到了。 好吧,字典的理解工作迭代器,但我建議改變「範圍(0,10)」爲「iter(xrange(0,10))」這是一個迭代器,使其「複製和粘貼 - 可證」 – 2012-12-05 01:31:51

1

您可能需要考慮使用標準庫的collections模塊中的defaultdict子類。通過使用它,你甚至可能甚至不需要迭代迭代器,因爲只要你第一次訪問它們,就會創建與指定默認值相關聯的鍵。

在下面的示例代碼中,我插入了一個免費的for循環來強制創建它們中的一些,因此以下的print語句將顯示一些內容。

from collections import defaultdict 

dflt_dict = defaultdict(lambda:42) 

# depending on what you're doing this might not be necessary... 
for k in xrange(0,10): 
    dflt_dict[k] # accessing any key adds it with the specified default value 

print dflt_dict.items() 
# [(0, 42), (1, 42), (2, 42), (3, 42), ... (6, 42), (7, 42), (8, 42), (9, 42)]