2

因此,我试图创建 3 个不同的列表,其中一个是 1k,一个是 10k,另一个是 100k 项目中的一个,其中长满了从 1 到 1000 万的随机数,但我似乎无法弄清楚为什么它一直说它的语法无效。到目前为止,我有:

编辑:好的,它似乎已经通过一些调整解决了无效的语法问题,但仍然给了我:

Traceback (most recent call last):
  File "C:/Python32/funtime.py", line 16, in <module>
    print (list[1])
TypeError: 'type' object is not subscriptable

这正是我输入的内容:

import random

def createlist(a):

    blist =[]
    count=0
    while count <= a:

        blist.append(random.randint(1,10000000))
        count= count+1
    return blist;


list1= createlist(10000);

print (list[1])
4

6 回答 6

3
Traceback (most recent call last):
  File "C:/Python32/funtime.py", line 16, in <module>
    print (list[1])
TypeError: 'type' object is not subscriptable

类型type的对象确实不可下标。list是内置列表类的名称,它是type. 给它下标没有任何意义,所以这显然不是你打算做的。

你的意思是print (list1[1])list1是您绑定到由创建的列表对象的名称createlist(10000)

找到这类错误的诀窍是查看 Python 给你的错误消息。它准确地告诉你问题所在,以及为什么它是一个问题。所缺少的只是实现list不是您要下标的对象的名称。

于 2012-09-07T02:31:51.093 回答
2

以下在我的系统上运行良好。

import random

def createlist(a):

    blist =[]
    count= 0
    while count <= a:
        blist.append(random.randint(1,1000000))
        count=count+1
    return blist

list1= createlist(10000)

print list1[1]

http://ideone.com/SL2bL <--在这里试试。

我可能会这样做

import random

def createlist(a):

    return [random.randint(1,1000000) for i in xrange(a)]


list1= createlist(10000)

print list1[1]

或者可能只是跳过该功能..

list1 = [random.randint(1,1000000) for i in xrange(a)]
print list1[1]
于 2012-09-07T02:04:39.937 回答
2

一个更短的版本是:

>>> import random
>>> def create_list(length):
...     return [random.randint(1,1000000) for _ in range(length)]

这说明了几件事:

  1. 一种更紧凑的循环x时间方式(for _ in range(length)成语)
  2. 列表推导式来创建列表,而不是重复调用append.
  3. _当您需要变量而不是其中的实际数据时,将其用作变量名。这是一个比较常见的约定,最常出现在列表推导中。不使用它不是问题,但它经常出现,以至于意识到它是值得的。

向@mgilson 致敬,感谢他对另一个让我想起_约定的答案的评论。

于 2012-09-07T02:15:39.267 回答
1

使用列表理解(它的方式让你看起来很专业,哈哈)

[random.randint(1, 1000000) for i in range(10000)]
于 2012-09-07T02:16:08.513 回答
1

正如其他一些答案所述,您可以轻松地将列表理解用于这样的事情(所谓的Pythonic方式):

somelist = [random.randint(1, 1000000) for i in xrange(10000)]

列表解析在 Python 中很快,因为它是由底层 C 代码执行的。此外,使用xrange更节省内存。

注意:按照惯例,当 Python 中不使用循环控制变量时,它被命名为_

somelist = [random.randint(1, 1000000) for _ in xrange(10000)]
于 2012-09-07T02:24:33.310 回答
-1

while首先,除非您正在评估复杂的表达式,否则不要使用括号。

接下来,您使用分号返回您的blist. 没有必要。

最后...为什么不使用 for 循环?

import random

def createlist(a): 
    blist =[]

    for x in xrange(a):
        blist.append(random.randint(1,1000000))

    return blist

list1= createlist(10000)

print list1[0]
于 2012-09-07T02:04:53.473 回答