循环列表(Python v3)初学者

时间:2013-10-21 09:40:57

标签: python python-3.x

我陷入了一个循环,它将消除低于平均值的值(来自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]

5 个答案:

答案 0 :(得分:4)

你快到了。而不是删除元素,而是选择要保留的元素:

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

你的错误是for i in alist:迭代列表元素本身而不是索引,因此alist[i]抛出错误(或返回废话)。

答案 1 :(得分: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.

答案 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]。你想调用一个函数,所以你使用括号。方括号用于索引和切片。