2015-07-12 47 views
2

我有一個數字列表,我想從中刪除最後一個奇數。當沒有之前整個列表重複過去的奇數此代碼的工作以及只:如何刪除列表中的最後一個奇數

numbers = [1, 7, 2, 34, 8, 7, 2, 5, 14, 22, 93, 48, 76, 15, 7] 
odd_numbers = [] 

def remove_last_odd(numbers): 
    for n in numbers: 
     if n % 2 != 0: 
      odd_numbers.append(n)  
    numbers.remove(odd_numbers[-1]) 
    return numbers 

因此不是刪除最後7的,我結束了我的「數字」列表中刪除的7第一次出現。

任何人都可以幫忙嗎?

+0

循環向後你的名單上沒有前進.. –

回答

4

不是最有效的方式,但將努力:

def remove_last_odd(numbers): 
    rnumbers = numbers[::-1] 
    for n in rnumbers: 
     if n % 2 != 0: 
      rnumbers.remove(n) 
      break 
    return rnumbers[::-1] 

基本上做到這一點:反向列表,刪除第奇數,再次逆轉並返回。

3

發生這種情況是因爲循環從第一個元素迭代到最後一個元素。只要反向循環:

for n in reversed(numbers): 
+0

不完全,這是因爲刪除()刪除第一次出現,不是因爲他迭代從開始到結束。您的解決方案將具有相同(錯誤)的輸出。 –

1

使用pop()而不是remove()remove()搜索列表中的參數值並找出找到的第一個參數值。 pop()刪除作爲參數傳入的特定索引處的元素。你需要重構你的代碼,以便找到最後一個奇數的索引,但是pop()將按照你的預期進行。

0
numbers = [1, 7, 2, 34, 8, 7, 2, 5, 14, 22, 93, 48, 76, 15, 7] 

_numbers = numbers[::-1] 

for i, index in enumerate(_numbers): 
    if i % 2 != 0: 
     del(_numbers[index]) 
    break 
print _numbers 
1

解決方案無需反轉列表:

def remove_last(iterable, condition): 
    result = [] 
    pre = [] 
    for x in iterable: 
     if condition(x): 
      result.extend(pre) 
      pre = [] 
     pre.append(x) 
    return result + pre[1:] 

remove_last([1,5,6,7,8,9,10], lambda x: x&1) 
>>> [1, 5, 6, 7, 8, 10] 
0

您可以使用maxenumerate無需反轉列表。 max爲您提供奇數的最後一個索引。和pop採用可選參數,它是要刪除的元素的索引。

def remove_last(numbers): 
    numbers.pop(max(i for i, j in enumerate(numbers) if j % 2 != 0)) 
    return numbers 
0

努力提高效率,這裏有一個解決方案,不會顛倒名單或兩次通過它。

def remove_last_odd(numbers): 
    idx = len(numbers) 
    last_odd = False 
    while not last_odd and idx > 0: 
     idx -= 1 
     last_odd = (numbers[idx] % 2 != 0) 

    return numbers[0:idx] 
0

這與Ness的方法類似,但我認爲更清楚一點。首先,我反轉列表,將每個元素附加到first_list中。

然後,我逐一檢查first_list項目,使用布爾標誌來標識(並跳過)第一個奇數,並將其他所有內容附加到second_list中。

最後,我反轉second_list,將其元素追加到third_list中。完成。

def remove_last_odd(numbers): 
    found_it = False 
    first_list = [] 
    second_list = [] 
    third_list = [] 

    for num in numbers[::-1]: 
     first_list.append(num) 

    for num in first_list: 

     if found_it == False: 

      if num % 2 == 0: 
       second_list.append(num) 
      else: 
       found_it = True 

     else: 
      second_list.append(num) 

    for num in second_list[::-1]: 
     third_list.append(num) 

    return third_list 
0

該解決方案使用For循環而不顛倒列表使用最後一個奇數的索引。

def remove_last_odd(numbers): 
    has_odd = False 
    last_odd = 0 

    for num in range(len(numbers)): 

     if numbers[num] % 2 == 1: 
      has_odd = True 
      last_odd =num 

     if has_odd: 
      numbers.pop(last_odd) 

    return numbers 
相關問題