把一个无限的自然数列表粘贴在一起,找到索引python



我需要制作一个无限的数字列表,并像这样列出它们:

[12345678910111213141516171819...]

[1,2,3,4,5,6,7,8,9,1,1,1,2,1,3,1,4,1,5,1,6,1,7,1,8,1,8,9....]

以便将数字粘贴在一起并可以单独索引(找到数字的位置,例如15th数字将是2

因此,用户必须输入一些数字,如

15202214101692002147483646

我的程序会输出

201.2

我现在明白了,我不能使用某种大列表,但必须制定某种搜索算法?

有人能帮忙吗?

您可以使用生成器来完成这类操作。查看下面带有yield的函数。

def natural_numbers():
    n = 0
    while True:
        n += 1
        yield n
def find_nth_character(n):
    numbers = ""
    gen = natural_numbers()
    while len(numbers) < n:
        numbers += str(gen.next())
    print numbers
    return numbers[n-1]

def main():
    print find_nth_character(15)
if __name__ == '__main__':
    main()

这段代码只存储一个大字符串。如果您要寻找一个非常高的索引号,您可能需要找到其他计算字符数的方法。然后,您可以丢弃目标之前的字符,并且不必担心存储潜在的巨大字符串。

我不确定是否理解,你不能列出无穷大,只有chuck norris可以做到!:p更严重的是,你的命令不能停止,因为无穷大永远不会停止,所以它是无限循环。如果你想,你可以列出很多数字,例如:

big_list = [i for i in range(10000000)]

但恐怕你做得再好不过了。。。

我不得不说,尽管这很难:您不能在python中拥有无限列表。Python的列表实际上需要每个元素的存储空间。既然没有内存无限的机器,就没有无限的python列表。

然而,可以做两件事:

  1. 编写一个函数,将自然数(您称之为索引)映射到(0;10)中的自然数。编写该函数相当容易。你知道每个长度的数字有多少,所以找到正确的答案实际上并不需要预先生成列表——它可以针对你实际需要的每个索引来完成
  2. 您可以使用同样的函数来实现[],尽管这在某种程度上是一个更高级的python功能

编辑:

绝对不要追求庞大的清单!只需编写一个函数,根据用户输入的内容返回正确的数字。。。你知道有9个数字有1位,有100-10个数字有2位,有10^3-10^2个数字有3位,等等。用普通数学符号在一张纸上写下你列表中的数字,你会很快开发出一种方法来获得列表中的第15001位,而不必计算出之前的所有15000位

除了有限空间中无穷大的明显问题之外,这可能就是您想要的。

list = []
for x in xrange(100):   # You could put any number you want until you hit memory limit
    var = 'stored data ' + str(x**2)    # stores text and a math function
    list.append(var)    # Append simply adds current value to the end of the list
    print list[x]    #prints your value for debug purposes

这将创建一个包含所有所需交互数据的索引列表,只需键入即可获得索引数据

print list[5] # or whatever number you want. You could also loop through it
for n in xrange(len(list) / 4): print list[x*4] # prints every fourth value

while版本为:

x = 10
while x == 10: list.append('your data')

但它只会达到内存限制并崩溃。

最新更新