0

平均以下の値を (alist から) 削除するループを作成することに行き詰まっています。助けてくれてありがとう。

a=input("Enter a list of values separated by a coma : ")
alist=eval(a)
print("the list is : ",alist)

average = sum(alist)/len(alist)
print("the average is : ",average)

for i in alist:
    if alist[i]<average:
        alist.remove[i]
4

5 に答える 5

4

あなたはほとんどそこにいます。要素を削除する代わりに、保持する要素を選択します。

alist = [a for a in alist if a>=average]

ここでのあなたの間違いはfor i in alist:、インデックスではなくリスト要素自体を反復処理しているためalist[i]、エラーをスローする (またはナンセンスを返す) ことです。

于 2013-10-21T09:44:19.767 に答える
3

「ループ」にはfilterlambda関数を使用できます。

above_average = list(filter(lambda x: x >= average, alist))

コードの残りの部分については、より安全なものにクリーンアップすることをお勧めします (eval の使用は非常に悪いです)。

import ast
user_string = raw_input('input a list of numbers separated by a commas: ')
alist = list(ast.literal_eval(user_string)))

したがって、全体として、コードを次のように記述します。

import ast
user_string = raw_input('input a list of numbers separated by a commas: ')
numbers = list(ast.literal_eval(user_string)))
average = sum(numbers)/len(numbers)
print('The numbers: {}'.format(numbers))
print('The average: {}'.format(average))
above_average = list(filter(lambda x: x >= average, numbers))
# now do what you want with the above_average numbers.
于 2013-10-21T09:43:56.547 に答える
2

他の答えは、それを行う方法を教えてくれます。うまくいかない理由を説明します。

リストを反復処理し、同時に変更します。

これにより、反復中に項目が見落とされます。

なんで?

内部的には、反復はリストへのインデックスを介して機能します。だからやってるのと同じ

idx = 0
while True:
    try:
        i = alist[idx]
    except IndexError: 
        break
    idx += 1
    if alist[i] < average:
        alist.remove(i)

要素 #3 にいて、次の要素に移動してから #3 を削除するとどうなりますか? そうです、残りのインデックスは下に移動し、以前は #5 だったインデックスを指しています。古い #4 は、このテストではスキップされます。

(ところで、あなたが気づいたかどうかわかりませんが、私はあなたの[]後ろ.removeをに置き換えました()。)

于 2013-10-21T09:50:00.067 に答える
1

このような StackOverflow の質問をするための一般原則として、入力と出力の例を常に含める必要があります。何が起こるか、何が起こると予想されるかを示してください。

この場合、あなたのコードには2 つの3 つの問題があると思います。

編集: 3 番目に、おそらく最も重要なことですが、glglgl の回答を見てください。以下に説明する 2 つの修正を実装しても、まだ 1 つの問題があります。削除したいすべてのアイテムがコードで削除されるとは限りません。一部のアイテムがスキップされるためです。

まず、 indexalist[i]の要素を取得します。しかし、すでにリスト内の連続した要素になると言っています。例:alistifor i in alisti

mylist = [1, 2, 4]
for i in mylist:
    print(i)

出力が得られます:

1
2
4

代わりにこれを言った場合(これはあなたが書いたようなものです)

mylist = [1, 2, 4]
for i in mylist:
    print(mylist[i])

インデックス 1 の要素を取得し、インデックス 2 の要素を取得してから、インデックス 4 の要素を取得しようとしますが、それは存在しないため、期待どおりには機能しません。次のようなものが得られます。

2
4
IndexError: list index out of range

第二に、要素を削除するための構文が間違っています。alist.remove(i)の代わりに使用する必要がありalist.remove[i]ます。関数を呼び出したいので、括弧を使用します。角かっこは、インデックス付けとスライス用です。

于 2013-10-21T09:52:12.297 に答える