我如何在Python中将元素附加到2D数组? (“表示数组的哈希表”)

问题描述 投票:0回答:1

[因此,我试图创建一个散列函数,将基于它的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数组。)

python arrays hash
1个回答
0
投票

第二种解决方案由于列表的乘法运算符的行为而无法使用。当有人写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)

© www.soinside.com 2019 - 2024. All rights reserved.