[因此,我试图创建一个散列函数,将基于它的mod将元素k放入2D数组中。对于此示例,外部数组的大小为4。因此,从哈希表开始,我希望它是一个2D数组,外部数组的大小为4。然后,外部数组内部将有4个空数组。像这样...
n = 4
A = [[]]* n
哪个是[ [], [], [], [] ]
,所以当我使用像hash(A, 2)
这样的哈希函数时,它应该根据下面的代码输出[ [], [], [2], [] ]
...
def hash(A, k):
idx = k % 4
for i in range(len(A)):
for j in range(len(A[i])):
if i == idx:
print(A[i][j])
A[i][j] = A[i][j].append(k)
因此,问题在于它输出此[ [], [], [], [] ]
而不是此[ [], [], [2], [] ]
。
我尝试过...
def hash(A, k):
idx = k % 4
A[idx].append(k)
但是这仅输出[[2], [2], [2], [2]]
,这不是我想要的。
如何使我的哈希函数给我这个输出[ [], [], [2], [] ]
?
(P.S。我知道,仅制作一个链表列表会好很多。我这样做是为了更好地理解哈希表(如果它们是通过数组实现的,并能更好地理解2D数组。)
第二种解决方案由于列表的乘法运算符的行为而无法使用。当有人写A = [[]]*n
时,实际上所有n个内部列表都是相同的列表(内存中的相同位置),因此更改其中一个会更改其中的每个列表。如果将A创建为A = [[] for _ in range(n)]
,则这些内部列表不再是同一对象,它们将按预期工作。
第一个解决方案由于多种原因而无法工作;最直接的是,对于每个i,len(A[i])
在循环开始时等于0,因此该函数每次都会跳过它(并且永远不会递增)。
即使更正它,A[i][j]
也不是列表,因此,当您在其上调用.append()
时,它会给您一个错误。列表为A[i]
,您将要追加到列表中。
不仅如此,第一个解决方案也遇到了与第二个解决方案相同的问题。
((来源:https://docs.python.org/3/library/stdtypes.html#common-sequence-operations,注释2和3)