我的python函数不会返回值

时间:2017-10-01 23:45:27

标签: python function hash return hashtable

我有一个用户定义的函数,它将table-size(m)作为输入。我实现了一个空列表(对[key,count],本质上是一个有两个字段的数组),并使用线性散列将生成的随机数插入列表中。因此,假设第一个随机数(k)是20并且列表(m)的长度是9,则散列函数(h0 = k%m)将返回2(因为这是20除以9时的余数)。如果该单元格为空,我想将键值(k)插入第一个字段,将1(探测计数)插入第二个字段。如果该单元格不为空,我想使用散列函数(h0 =(h0 + i)%m)递增索引,直到找到一个空单元格并插入那里。我想返回结果列表。我在我的函数中有一个return语句,我读过的文档说我在调用函数时使用print语句分配一个新值应该有效。我正在使用PyCharm社区版。我的IDE可能是问题吗? (下面是我的代码)

import random

def linear(m):

hTable = [[None, None] for j in range (m)]

for n in range (1100):
    k = random.randint(1,10000)

    for i in range(len(hTable)):
        for j in range(len(hTable[i])):
            h0 = k % m

            if hTable[h0] == [None,None]:
                hTable[h0][0] = k
                hTable[h0][1] = 1

            else:
                while hTable[h0] != [None, None]:
                    hTable[h0][1] += 1
                    h0 = (h0 + i)%m

                else:
                    hTable[h0][0] = k
                    hTable[h0][1] = 1

                    return hTable

                hash = linear(1223)
                print(hash)

2 个答案:

答案 0 :(得分:0)

>>> [None,None]*2
[None, None, None, None]

在Python中,乘以列表会扩展列表,但不会使其成为多维的。你可能想要[[None, None] for i in range(m)

之类的东西

(我也不确定你的代码通常在做什么,因为在第一次迭代时,所有内容都会== [None, None]并导致你的else块被执行 - 其中有一个返回值,因此返回的数组将由hTable[h0] = [k, 1]和每个其他元素[None, None] ...)

组成

此外,h0每次迭代都会有相同的值(因为它是根据未更改的值计算得出的)......您可能希望return hTable,而不是[hTable] ,因为它已经是一个清单。

答案 1 :(得分:0)

问题是我的退货声明的缩进。以下作品:

import random

def linear(m):

    hTable = [[None, 0] for j in range (m)]

    nums = [random.randint(1,10001) for n in range(1100)]

    for i in range(len(nums)):
        h0 = nums[i] % m

        while hTable[h0] != [None, 0]:
            hTable[h0][1] += 1
            h0 = (h0 + 1)%m

        else:
            hTable[h0][0] = nums[i]
            hTable[h0][1] = 1

    count = sum(i[1] for i in hTable)
    print (count)

    return hTable

l = linear(1223)
print(l)