【问题标题】:What does this line of code do when initializing a hash table in python? [duplicate]在 python 中初始化哈希表时,这行代码做了什么? [复制]
【发布时间】:2017-08-20 18:54:46
【问题描述】:

我正在寻找如何在 python 中创建哈希表的解决方案并遇到了这个函数:

def __init__(self, size):
    self.size = size
    self.table = [[] for _ in range(self.size)]

创建多维数组的第三行代码让我很困惑。主要是这部分:

for _ in range(self.size)

这到底是做什么的?为什么需要它而不是仅仅做这样的事情:

[[] self.size]

哪个会创建一个大小为 self.size 正确的二维数组?任何形式的视觉辅助工具也会有帮助。

【问题讨论】:

  • [[] self.size] 创建一个数组,其第一个元素是一个空数组,第二个元素是一个数字。
  • 你的意思是[] * self.size
  • [[] self.size] 是语法错误。 [[], self.size] 将是一个列表,其中包含一个空列表以及 self.size 是什么。
  • 好吧,我误以为[[] self.size] 声明了一个self.size 大小的数组,每个索引都包含一个空数组。感谢您清除它。

标签: python arrays hashtable


【解决方案1】:

线

self.table = [[] for _ in range(self.size)]

创建一个桶数组来保存哈希表的内容。

变量名_ 用于表示该变量无关紧要,其内容本质上已被丢弃。这对于具有短范围的未使用变量很有用,例如这个。

你建议这样初始化:

self.table = [[]]*self.size

但这是一个坏主意,因为您实际上得到了同一列表的self.size 副本!那就是:

a=[[]]*4
>>> [[], [], [], []]
a[0].append(3)
>>> [[3], [3], [3], [3]]

【讨论】:

  • 同一个列表
  • @juanpa.arrivillaga:完全正确。我已经修正了错误。
  • 是的,很抱歉我显得很迂腐,但这是我的一个小烦恼。 Python 列表与数组不同,尤其是 C++ 和 Java 等语言中的数组。它们是具有恒定时间追加/扩展操作的异构、可调整大小的数组列表。
  • @juanpa.arrivillaga:我的措辞很模糊,我很感激提醒他们这些本质上是不同的数据结构。
【解决方案2】:
>>> good_table = [[] for _ in range(5)]
>>> good_table
[[], [], [], [], []]
>>> good_table[0].append(3)
>>> good_table
[[3], [], [], [], []]
>>> suggested_table = [[] 5]
  File "<input>", line 1
    suggested_table = [[] 5]
                          ^
SyntaxError: invalid syntax
>>> suggested_table = [[] * 5]
>>> suggested_table
[[]]
>>> [] * 5
[]
>>> bad_table = [[]] * 5
>>> bad_table
[[], [], [], [], []]
>>> bad_table[0].append(3)
>>> bad_table
[[3], [3], [3], [3], [3]]

最后一部分见List of lists changes reflected across sublists unexpectedly

【讨论】:

  • 我很想知道为什么人们不赞成这个。我需要添加什么信息?其他地方还没有完全涵盖哪些内容?
猜你喜欢
  • 2013-07-09
  • 2018-03-14
  • 2023-03-17
  • 2016-02-17
  • 2013-01-15
  • 2016-02-07
  • 1970-01-01
  • 2015-04-29
  • 1970-01-01
相关资源
最近更新 更多