我有一个数字列表,我想从中删除最后的奇数。只有在以下列表中没有重复最后一个奇数时,此代码才能正常工作:
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]
基本上这样做:反向列表,删除第一个奇数,再反转并返回。
答案 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