3

python 文档暗示列表中可以存在重复项,这由 assignmnet 支持:list = ["word1", "word1"]。但是,如果项目已经在列表中,Python 的 append() 似乎不会添加项目。我在这里遗漏了什么,还是故意尝试类似 set() 的行为?

>> 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

第二个字2在哪里?

4

7 回答 7

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]})
于 2012-05-22T19:07:57.950 回答
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']
于 2012-05-22T19:07:57.610 回答
1

没有第二个"word2",因为dicts 每个键只有一个条目。这是哈希表支持的映射的通常行为。

请注意,如果您只想要一个dictuse的键dict.keys()

于 2012-05-22T19:08:28.103 回答
0

它从来没有出现过(除非你的例子不正确)。dict覆盖它:

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

第二个word2覆盖了第一个。dict键必须是唯一的。

于 2012-05-22T19:08:21.677 回答
0

这里的问题不append()在于 ,而是字典中不能有重复的键,它们都必须是唯一的。

这意味着该行d["word2"] = 3没有添加额外的"word2"键,它正在覆盖 的当前值d["word2"]

于 2012-05-22T19:08:33.263 回答
0

因为 d 是一个字典,一个键可能只有一个值,所以当你修改d["word2"] = 2then时d["word2"] = 3,你是在用 3 覆盖值 2。

>> 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}
于 2012-05-22T19:18:12.453 回答
0

字典映射重复键并用最新输入的条目覆盖旧条目。

>>> d = {}
>>> d["word1"] = 1
>>> d
{'word1': 1}
>>> d["word2"] = 2
>>> d
{'word1': 1, 'word2': 2}
>>> d["word2"] = 3
>>> d
{'word1': 1, 'word2': 3}
于 2012-05-22T19:29:05.233 回答