如何删除列表中的最后一个奇数

时间:2015-07-12 15:10:43

标签: python list

我有一个数字列表,我想从中删除最后的奇数。只有在以下列表中没有重复最后一个奇数时,此代码才能正常工作:

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位。

有人可以帮忙吗?

9 个答案:

答案 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]

基本上这样做:反向列表,删除第一个奇数,再反转并返回。

答案 1 :(得分:3)

这是因为循环从第一个元素迭代到最后一个元素。只需反向循环:

for n in reversed(numbers):

答案 2 :(得分:1)

使用pop()代替remove()remove()在列表中搜索参数值,并取出它找到的第一个参数值。 pop()删除作为参数传入的特定索引处的元素。您需要重构代码,以便找到最后一个奇数的索引,但pop()将按预期执行。

答案 3 :(得分: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]

答案 4 :(得分:0)

using UnityEngine;
using System.Collections;

public class Main : MonoBehaviour
{
    private string _data = string.Empty;
    public Texture2D bg;

    void OnGUI()
    {
        if (GUI.Button(new Rect(Screen.width*0.5f-32,32,64,32),"Save"))
            StartCoroutine(ScreeAndSave());
    }

    IEnumerator ScreeAndSave()
    {
        yield return new WaitForEndOfFrame();
        var newTexture = ScreenShoot(Camera.main, bg.width, bg.height);
        LerpTexture(bg, ref newTexture);
        _data = System.Convert.ToBase64String(newTexture.EncodeToPNG());
        Application.ExternalEval("document.location.href='data:octet-stream;base64," + _data + "'");
    }

    private static Texture2D ScreenShoot(Camera srcCamera, int width, int height)
    {
        var renderTexture = new RenderTexture(width, height, 0);
        var targetTexture = new Texture2D(width, height, TextureFormat.RGB24, false);
        srcCamera.targetTexture = renderTexture;    
        srcCamera.Render();
        RenderTexture.active = renderTexture;
        targetTexture.ReadPixels(new Rect(0, 0, width, height), 0, 0);
        targetTexture.Apply();
        srcCamera.targetTexture = null;
        RenderTexture.active = null;
        srcCamera.ResetAspect();
        return targetTexture;
    }

    private static void LerpTexture(Texture2D alphaTexture, ref Texture2D texture)
    {
        var bgColors = alphaTexture.GetPixels();
        var tarCols = texture.GetPixels();
        for (var i = 0; i < tarCols.Length; i++)
            tarCols[i] = bgColors[i].a > 0.99f ? bgColors[i] :  Color.Lerp(tarCols[i], bgColors[i], bgColors[i].a);
        texture.SetPixels(tarCols);
        texture.Apply();
    }
}

答案 5 :(得分:0)

您可以--fake使用max而不撤消列表。 enumerate为您提供奇数的最后一个索引。并且max接受一个可选参数,该参数是要删除的元素的索引。

pop

答案 6 :(得分:0)

努力提高效率,这里的解决方案不会反转清单或经历两次。

//writing on the file
         using (TextWriter tw = new StreamWriter("PATH"))
         {
             for (int i = 0; i < colonne; i++)
             {
                 for (int y = 0; y < righe; y++)
                 {
                     tw.Write(matrice[y, i]+","); 
                 }
                 tw.WriteLine();
             }
         }

         using (FileStream fs = File.OpenWrite("PATH"))
         {
             fs.SetLength(fs.Length - 1);
             fs.Close();
         }

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

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