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

对于“循环”,您可以使用 afilter和一个lambda函数。

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

您正在混合两种迭代列表的方式:按索引和按元素。在您的循环中,i不是索引,而是列表本身的元素,因此alist[i]不起作用。

如果使用for x in somelist循环,那么x是元素本身,而不是元素的索引。对于迭代索引,您可以使用for i in range(len(somelist)),或者您可以使用for i, x in enumerate(somelist)循环索引和元素的元组。

另请注意,在循环它们时从列表或其他类型的集合中删除元素通常是一个坏主意。最好创建列表的副本。

for x in list(alist):     # creates a copy of alist
    if x < average:       # remember: x is the element itselt
        alist.remove(x)   # remove element x from list

但是你这样做的方式(用eval逗号分隔的数字字符串)alist是一个元组,而不是一个列表,因此根本没有remove方法。因此,您要么必须在 ( 之前将其转换为列表alist = list(eval(a)),要么使用其他答案中给出的方法之一,使用列表理解或过滤器创建一个新列表并保留“好”元素。

于 2013-10-21T09:47:55.380 回答
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 提出此类问题的一般原则,您应该始终包含示例输入和输出——显示发生了什么以及您期望发生什么。

在这种情况下,我相信您的代码存在两个三个问题:

编辑:第三,但可能最重要的是,看看glglgl's answer。如果您实施我在下面描述的两个修复程序,您仍然会遇到一个问题:您的代码不一定会删除您要删除的所有项目,因为它会跳过一些项目。

首先,你说alist[i],它抓住了alistat index的元素i。但是说已经for i in alist成为i列表中的连续元素。例子:

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 回答