2

だから私は3つの異なるリストを作成しようとしています。1k、10k、10万のアイテムの1つで、100万から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)]

リスト内包表記は、基になる C コードによって実行されるため、Python では高速です。さらに、 usingxrangeはメモリ効率が高くなります。

注: 慣例により、ループ制御変数が 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 に答える