2015-11-25 618 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)