2012-05-22 50 views
3

python文檔意味着重複的項目可以存在於列表中,並且assignmnet支持:list = [「word1」,「word1」]。然而,Python的append()似乎沒有添加一個項目,如果它已經在列表中。我在這裏錯過了什麼,或者這是故意嘗試一個set()類似的行爲?Python的append()只允許列表中的唯一項目?

>> d = {} 
>> d["word1"] = 1 
>> d["word2"] = 2 
>> d["word2"] = 3 

>> vocab = [] 
>> for word,freq in d.iteritems(): 
>> ... vocab.append(word) 

>> for item in vocab: 
>> ... print item 

回報:

word1 
word2 

在哪裏第二WORD2?

+0

如果不包含'>>和'...',這會很有幫助 - 這使其他人無法使用您的代碼。 – Marcin

+2

對不起,我實際上添加了手動後從notepad ++複製我的代碼,因爲我看到有些人在這裏做的代碼和輸出之間的區別。我認爲這會有所幫助;但不會再做,因爲你說得很好! – Zach

+0

您可能需要[集合](http://docs.python.org/release/2.4.4/lib/types-set.html)元組而不是字典。這將允許'(「word2」,2)'只有一次,無論你添加了多少次,但同時也會允許'(「word2」,3)''。 – Steve314

回答

8

沒有第二個單詞2。

>>> d = {} 
>>> d["word1"] = 1 
>>> d["word2"] = 2 
>>> d 
{'word1': 1, 'word2': 2} 
>>> d["word2"] = 3 
>>> d 
{'word1': 1, 'word2': 3} 

詞典將特定鍵映射到特定值。如果你想要一個鍵對應多個值,通常使用列表和defaultdict是非常方便的:

>>> from collections import defaultdict 
>>> d = defaultdict(list) 
>>> d["word1"].append(1) 
>>> d["word2"].append(2) 
>>> d["word2"].append(3) 
>>> d 
defaultdict(<type 'list'>, {'word1': [1], 'word2': [2, 3]}) 
+0

IOW,字典是地圖,而不是[multimap](http://en.wikipedia.org/wiki/Multimap)。 – Steve314

+0

啊是的,愚蠢的我! – Zach

3

你先把單詞放到字典裏。字典不接受重複項,所以當你在字典中輸入兩次相同的密鑰時,第二項將覆蓋第一項。然後,當你遍歷字典中的鍵時,你不會有重複。

>>> d = {} 
>>> d['word1'] = 1 
>>> d['word2'] = 2 
>>> d['word2'] = 3 
>>> print d 
{'word1': 1, 'word2': 3} 

迭代與副本列表中它可以作爲一個期望:

>>> words = ['word1', 'word2', 'word2'] 
>>> newlist = [] 
>>> for word in words: 
...  newlist.append(word) 
... 
>>> newlist 
['word1', 'word2', 'word2'] 
0

這是從來沒有出現(除非你的例子是不正確的)。 dict改寫它:

In [5]: d 
Out[5]: {'word1': 1, 'word2': 3} 

第二word2覆蓋了第一個。 dict鍵必須是唯一的。

1

沒有第二個"word2",因爲dict只有每個鍵一個條目。這是散列表支持的映射的通常行爲。

請注意,如果您只想要dict的密鑰使用dict.keys()

0

這裏的問題不在append(),它是你不能在字典中有重複鍵,它們都必須是唯一的。

這意味着行d["word2"] = 3沒有添加額外的"word2"鍵,它將覆蓋當前值d["word2"]

0

因爲d是一個字典,一鍵只能有一個值,所以當你修改d["word2"] = 2然後d["word2"] = 3,你用3

>> d = {} 
>> d["word1"] = 1 
>> d["word2"] = 2 
>> d["word2"] = 3 

#the fourth line `d["word2"] = 3` only modifies the value of d["word2"]. 

>> print(d) 
{'word1': 1, 'word2': 3} 
0

字典地圖覆蓋值2重複鍵,並覆蓋舊的按最新輸入的條目輸入。

>>> d = {} 
>>> d["word1"] = 1 
>>> d 
{'word1': 1} 
>>> d["word2"] = 2 
>>> d 
{'word1': 1, 'word2': 2} 
>>> d["word2"] = 3 
>>> d 
{'word1': 1, 'word2': 3}