2015-11-25 263 views
-2

我目前的代码使用for循环,我试图从列表3中删除偶数和列表2中的奇数。 但是我的问题是,当for循环迭代时,项目在位置2,向下移动一个项目被删除后位置的一个,因此跳过一个项目,按计划Python for循环列表

list1 = ["roll", "burger", "cheese", "ketchup", "mustard"] 
list2 = [] 
list3 = [] 

for i in list1: 
    print(i) 
#code to add ten numbers to list2 
a = 0 
while a < 10: 
a = a + 1 
userdata = input("Enter a whole number: ") 
usernum = int(userdata) 
list2.append(usernum) 

list3[:0]=list2 
print(list3) 

for n in list2: 
    if int(n) % 2 != 0: 
     list2.remove(n) 
print(list2) 

for x in list3: 
    if int(x) % 2 == 0: 
     list3.remove(x) 
print(list3) 

我怎么会做出这样的代码删除奇偶码不起作用使用for循环没有跳过任何数字?

+0

你真的想把它变成原地吗?怎么样的列表理解呢? – bereal

+0

例如,您可以创建一个新列表并将其推入所需的值,而不是将其从正在迭代的列表中删除。 – rakwaht

+0

或者,您可以在输入阶段将其追加到所需的列表。 – bereal

回答

1

首先,修改你正在迭代的列表是一个未定义的行为,因此是一个不好的做法。 对于你的问题,我建议你使用filter

even = filter(lambda x: x%2, list3) 
odd = filter(lambda x: not x%2, list2) 
1

基本上修改您的列表,而迭代是一个不好的做法。由于在迭代它时正在修改列表。您可以使用列表理解:

list2 = [n for n in list2 if int(n) % 2 == 0] 
print list2 

list3 = [n for n in list3 if int(n) % 2 != 0] 
print list3 
2

首先,你不应该修改你迭代的列表。

至于你消除奇数和偶数的名单数量的问题,对于这个在Python一个非常简单的方法:filter()

过滤器生成一个简单的lambda函数相结合,将这样的伎俩:

list3 = filter(lambda x: x % 2, list3) 
0

您可以复制列表而迭代,但做实际的名单上去除:

list1 = ["roll", "burger", "cheese", "ketchup", "mustard"] 
list2 = [] 
list3 = [] 

for i in list1: 
    print(i) 
#code to add ten numbers to list2 
a = 0 
while a < 10: 
a = a + 1 
userdata = input("Enter a whole number: ") 
usernum = int(userdata) 
list2.append(usernum) 

list3[:0]=list2 
print(list3) 

for n in list(list2): 
    if int(n) % 2 != 0: 
     list2.remove(n) 
print(list2) 

for x in list(list3): 
    if int(x) % 2 == 0: 
     list3.remove(x) 
print(list3) 
1

作为替代列表过滤,您可以在用户输入它们时对值进行排序。对于看起来像这样的问题的适当分离:

def get_numbers(num=10): 
    for _ in xrange(10): 
     yield int(input("Enter a whole number: ")) 

def populate_lists(size, evens, odds): 
    for number in get_numbers(size): 
     (odds if (size % 2) else evens).append(number)