使用.pop()时出现奇怪的反应

2024-04-25 14:50:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在做一些练习,我的任务是从字符串中删除第一个数字,直到它是奇数。你知道吗

The function should remove elements from the front of lst until the front of the list is not even. The function should then return lst.

For example if lst started as [4, 8, 10, 11, 12, 15], then delete_starting_evens(lst) should return [11, 12, 15].

def delete_starting_evens(lst):
  for i in lst:
    if i % 2 == 0:
      lst.pop(0)
    else:
      break
  return lst

print(delete_starting_evens([4, 8, 6, 6, 6, 10, 11, 12, 15]))

print(delete_starting_evens([4, 8, 10]))

def delete_starting_evens(lst):
  for i in lst:
    if i % 2 == 0:
      lst = lst[1:]
    else:
      break
  return lst

print(delete_starting_evens([4, 8, 6, 6, 6, 10, 11, 12, 15]))

print(delete_starting_evens([4, 8, 10]))`

如果我使用lst = lst[1:],代码就可以正常工作, 但是我不明白为什么lst.pop(0)版本不起作用。它将在几次迭代中工作,但之后就不再流行了。你知道吗


Tags: ofthereturnifdeffunctiondeletefront
1条回答
网友
1楼 · 发布于 2024-04-25 14:50:17

在对列表进行迭代时修改列表通常是一个获得奇怪结果的方法。尝试在每次迭代中打印lsti,您将看到发生了什么。。。(试着用lst = [2,4,6,8,10,...]把它弄清楚…)

这里有一个安全的方法:

def delete_starting_evens(lst):
    for i, x in enumerate(lst):
        if x % 2 != 0:
            break
    else:
        return []
    return lst[i:]

请注意,pop会改变列表,而lst = lst[1:]会重新分配列表。你知道吗

如果效率很重要:

def f():
    lst = list(range(0,10000,2))+[3,0,2,4,6]
    for i, x in enumerate(lst):
        if x % 2:
            break
    else:
        return []
    return lst[i:]

def g():
    lst = list(range(0,10000,2))+[3,0,2,4,6]
    while lst and lst[0] % 2 == 0:
        lst.pop(0)
    return lst

%timeit f()
# 334 µs ± 2.17 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit g()
# 2.09 ms ± 12.9 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

相关问题 更多 >