我陷入了一个循环,它将消除低于平均值的值(来自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]
答案 0 :(得分:4)
你快到了。而不是删除元素,而是选择要保留的元素:
alist = [a for a in alist if a>=average]
你的错误是for i in alist:
迭代列表元素本身而不是索引,因此alist[i]
抛出错误(或返回废话)。
答案 1 :(得分:3)
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.
答案 2 :(得分: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))
,或使用其他答案中给出的方法之一,使用列表推导或过滤器创建新列表并保留“好”元素。
答案 3 :(得分: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。
(顺便说一句,我不知道您是否注意到,我已将[{1}}替换为[]
.remove
。{/ p>
答案 4 :(得分:1)
作为询问类似StackOverflow问题的一般原则,您应该始终包含示例输入和输出 - 显示发生的情况以及您希望发生的情况。
在这种情况下,我相信您的代码存在两个三个问题:
编辑:第三,,但可能最重要的是,请查看glglgl's answer。如果您实施我在下面描述的两个修补程序,您仍然会遇到一个问题:您的代码赢得了必须删除您要删除的所有项目,因为它会跳过某些项目强>
首先,你说alist[i]
,它在索引alist
抓取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]
。你想调用一个函数,所以你使用括号。方括号用于索引和切片。