【问题标题】:Python's append() only allows unique items in a list?Python append() 只允许列表中的唯一项目?
【发布时间】:2012-05-29 07:43:21
【问题描述】:

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

第二个词在哪里?

【问题讨论】:

  • 如果您不包含 >>... 会很有帮助 - 这会使其他人难以使用您的代码。
  • 对不起,我实际上是在从记事本++复制我的代码后手动添加的,因为我看到有些人在这里这样做是为了区分代码和输出。我认为这会有所帮助;但不会再这样做了,因为你的观点很好!
  • 您可能需要一个 set 元组而不是字典。这将只允许("word2", 2) 一次,无论您添加多少次,但同时也允许("word2", 3)
  • 人们不会自己插入>>>...。这来自 python 交互式解释器。你也应该使用它——它有助于回答这样的问题。这是online version,这是在您自己的计算机上start it up 的方法。
  • @Steve314 有多种实现。使用这些可能比在代码中嵌入这些操作作为集合操作更容易。

标签: python data-structures append


【解决方案1】:

因为d是字典,一个键可能只有一个值,所以当你修改d["word2"] = 2再修改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}

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      这意味着d["word2"] = 3 行没有添加额外的"word2" 键,而是覆盖d["word2"] 的当前值。

      【讨论】:

        【解决方案4】:

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

        请注意,如果您只想要 dict 的键,请使用 dict.keys()

        【讨论】:

          【解决方案5】:

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

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

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

          【讨论】:

            【解决方案6】:

            没有第二个词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]})
            

            【讨论】:

            • IOW,字典是地图,而不是multimap
            【解决方案7】:

            您首先将单词放入字典中。字典不接受重复项,因此当您在字典中输入相同的键两次时,第二个条目会覆盖第一个条目。然后,当您遍历字典中的键时,您不会得到重复项。

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

            【讨论】:

              猜你喜欢
              • 2011-07-06
              • 2021-06-01
              • 2012-05-28
              • 1970-01-01
              • 2021-10-23
              • 1970-01-01
              • 1970-01-01
              • 2017-12-08
              • 1970-01-01
              相关资源
              最近更新 更多