【问题标题】:How to use index as a key in Python?如何在 Python 中使用索引作为键?
【发布时间】:2011-10-05 15:56:14
【问题描述】:

我有一个列表:v = [1,2,2,3]。我想将此列表用作键。我可以“手动”完成:

x = {}
x[1,2,2,3] = 7

但是

x[v] = 7

不起作用。做我需要做的最简单的方法是什么?

添加

我认为解决方案是这样的:

x[open(v)] = 7

【问题讨论】:

  • 嗯,肯定不是open();这将尝试读取名为 [1,2,2,3] 的文件,因为列表不是字符串...

标签: python list dictionary key assign


【解决方案1】:

问题是键必须是不可变的,而列表则不是。然而,元组是。

只需将v 转换为元组:

x[tuple(v)] = 7

细说一下,上面写的一样

x[1,2,2,3] = 7

而后者是

的句法变体
x[(1,2,2,3)] = 7

【讨论】:

  • 稍微详细说明一下;当您说x[1,2,2,3] 时,您根本不是按列表索引,它与:x.__getitem__([1,2,2,3]) 不同,而是x.__getitem__((1,2,2,3)),尽管有[]
【解决方案2】:

Python 有两种相似的数据结构来存储值列表。 list 是可变版本:它的值可以更改。

x = [1, 2, 2, 3]
x = list((1, 2, 3, 4))

tuple 是不可变版本。一旦创建,它的值就不能被修改。

x = 1, 2, 2, 3
x = (1, 2, 2, 3)
x = tuple((1, 2, 2, 3))

Python 不允许您将可变类型用作字典键,因此您只需将元组创建为列表:

x[tuple(v)] = 7

【讨论】:

    【解决方案3】:

    Dict keys must be hashable。列表不是可散列的,但元组是。 (对象生命周期内对象should never change 的哈希值。此外,比较相等的两个可哈希对象必须具有相同的哈希。由于列表是可变的,满足这两个条件的唯一方法是让所有列表返回相同的哈希值。Python 不允许这样做并破坏哈希的目的,而是使所有可变容器都不可哈希。)

    x[tuple(v)]
    

    x[1,2,2,3] 有效,因为元组是indicated by the use of commas,而不是括号:

    In [78]: 1,2,2,3
    Out[78]: (1, 2, 2, 3)
    

    【讨论】:

      猜你喜欢
      • 2019-11-14
      • 2014-09-01
      • 2013-08-22
      • 2012-04-29
      • 2011-03-29
      • 1970-01-01
      • 1970-01-01
      • 2021-09-01
      • 2020-01-11
      相关资源
      最近更新 更多