【问题标题】:Python dictionary removed key when using operator使用运算符时Python字典删除了键
【发布时间】:2017-05-17 01:36:24
【问题描述】:

我目前正在制作一本包含单词和短语的字典(假设一个短语不能在同一个字符串中,因为它们不能,请在这里忍受我)。长话短说,如何使字典中的键包含多个字符串?我试过在两个字符串之间使用“and”,但这似乎会删除整个键和值。

编辑:好的,事后看来,我不太清楚发生了什么。以下是正在发生的事情:

def execute(text):
    dic1 = {
        "some word": 1,
        "another word":1,
        "hello" + "world": 5 ##this is what i attempted
    }

当我打印出“hello”+“world”键时,返回的键是“helloworld”,这不是我想要的。我希望键是两个字符串。我试图用“and”替换+,但它完全删除了密钥。 (通过这个,我的意思是它会用列表中的下一个替换这个键)。基本上,我如何使密钥由两个字符串组成,以便我能够为其他目的调用它?

【问题讨论】:

标签: python dictionary


【解决方案1】:

单个dict 项目不能有两个键。因此,如果您需要两个键来访问相同的值,则必须制作两个项目,每个键一个。例如,

dic1 = 
{
    "some word": 1,
    "another word": 1,
    "hello": 5,
    "world": 5,
}

请注意,如果您执行类似的操作

a = ["some", "data"]
dic1 = {"key1": a, "key2": a}
a.append("words")

那么dic1["key1"]dic1["key2"] 都将检索["some", "data", "words"],因为这两个键都与同一个列表相关联。


如果您需要键是某种单词对,您可以使用元组作为键,如叶子的答案所示。另一种选择是使用 freezesets 作为键 - 这样做的好处是 frozenset(["hello", "world"]) 等于 frozenset(["world", "hello"]),因此在查找项目时词序并不重要。

【讨论】:

    【解决方案2】:

    如果你想让一个键包含多个值,你需要使用一个序列。有人可能会尝试使用list(),但您不能。它们是可变的。您需要改用 tuple()s,它 不是可变的 - 或不可变的。

    >>> # list are mutable, which means they cannot be used
    >>> # as keys in a dictionary.
    >>> {[]:''}
    Traceback (most recent call last):
      File "<pyshell#6>", line 1, in <module>
        {[]:''}
    TypeError: unhashable type: 'list'
    >>> # you need to use tuples instead, which
    >>> # are not mutable.
    >>> {():''}
    {(): ''}
    >>> {('a', 'b'):'c'}
    {('a', 'b'): 'c'}
    >>> 
    

    Python 字典的文档也说明了这一点:

    如果元组只包含字符串、数字或元组,则它们可以用作键;如果元组直接或间接包含任何可变对象,则不能将其用作键。您不能将列表用作键,因为可以使用索引分配、切片分配或append()extend() 等方法就地修改列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-08
      • 2014-09-02
      • 1970-01-01
      • 1970-01-01
      • 2019-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多