【问题标题】:My python function will not return value我的python函数不会返回值
【发布时间】:2018-03-13 01:51:47
【问题描述】:

我有一个用户定义的函数,它以表格大小 (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)

【问题讨论】:

  • 我忘了说当我运行脚本时,我没有得到任何返回错误,但我也没有得到我想要的输出。我唯一的输出是“进程以退出代码 0 完成”
  • 您是否只是忘记调用您的函数?类似linear(5)
  • 您正在对以下行中的 None 类型的对象执行 len 函数:for j in range(len(hTable[i])):。您的意思是将 hTable 设置为二维数组吗?如果您希望 hTable 是二维的,您可以这样做:hTable = [[None for x in range(width)] for y in range(height)]。希望这会有所帮助。
  • @ImportanceOfBeingErnest 该函数的调用在上面的脚本中。
  • @BKovac 是的,我将列表实现更改为“hTable = [[[] for i in range(2)] for j in range (m)]”。

标签: python function hash return hashtable


【解决方案1】:
>>> [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],因为它已经是一个列表.

【讨论】:

  • 当列表中的记录为 [None, None] 时,else 语句在左侧字段插入“k”,在右侧插入“1”,因为该位置已被探测过 1 次。正如我所说,它是一个用于将值插入空列表的哈希函数。该函数返回一个索引,如果单元格为空,则插入 k 和 count,如果不是,则 while 循环使用哈希来获取新索引。每次新兰特时,“k”都会改变。生成的数字是“对于范围内的 n (1100)”次。 “return hTable”也不起作用。我还将我的列表实现更改为“hTable = [[[] for i in range(2)] for j in range (m)]”所以谢谢你
【解决方案2】:

问题是我的 return 语句的缩进。以下作品:

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-18
    • 1970-01-01
    • 1970-01-01
    • 2013-03-25
    • 1970-01-01
    • 2017-04-07
    相关资源
    最近更新 更多