如何跳过 python 列表中的项目?

How to skip item in list in python?

我有一个字符串列表。我想遍历它们并只打印前三项。但是,如果其中一项相当于“已删除”,那么我想跳过该项目并打印下一项(只要它不等于“已删除”)。

换句话说,我想过滤掉一个我不想要的字符串,并在列表中打印前三项。这是我的代码:


days = ["deleted", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]

position = 3

for res_counter, day in enumerate(days[:position], start=1):
    if "deleted" in day:
        position += 1
        continue
    else:
        print(res_counter, day)

我期望的输出:

1 Sun
2 Mon
3 Tue

我收到的输出:

2 Sun
3 Mon

没有抛出任何错误,我只是没有得到我想要的输出。我知道我的逻辑肯定有问题,如果有人能帮助我,我将不胜感激。

问题是您已经在 position 的第一个值处对列表进行了切片:

days[:position]

这意味着稍后递增 position 不会向此切片添加元素。通过一些调整,您的解决方案将起作用:

idx = 1
for day in days:
    if "deleted" in day:
        continue
    else:
        print(idx, day)
        idx += 1
        if idx > position:
            break

这输出:

1 Sun
2 Mon
3 Tue

请注意,我们可能会遍历所有 days,因为我们无法提前知道其中有多少元素将包含 "deleted"

一个更短(但仍然同样有效)的过程是使用 filteritertools.islice:

from itertools import islice
position = 3
for idx, day in islice(enumerate(filter(lambda x : "deleted" not in x, days), 1), position):
    print(idx, day)

我们在这里做什么:这一行

enumerate(filter(lambda x : "deleted" not in x, days), 1)

returns 编号对 idx, day,同时过滤掉其中包含 "deleted" 的元素。具体来说,这是一个生成器表达式,所以我们不需要提前处理所有的days。下一个

islice(iterable, position)

表示 return 可迭代对象的前 position 个元素(在本例中,它是我们的生成器表达式)。结果是我们没有处理比我们需要更多的元素,但我们能够用更少的行实现相同的结果。

您可以使用过滤器将其过滤掉“已删除”的元素,然后对结果列表进行切片或循环:

days = ["deleted", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]
filtered_days = list(filter(lambda f: f != "deleted", days))

position = 3

for res_counter, day in enumerate(filtered_days[:position]):
    print(res_counter + 1, day)

使用生成器函数

def my_filter(lst, delete):
  for e in lst:
    if e == delete: continue
    yield e

days = ["deleted", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]

position = 3

for i,day in enumerate(my_filter(days, 'deleted')):
  if i == position: break
  print(i+1, day)

或生成器表达式,不要通过将其转换为 list

来处理整个列表(可能很大并且本身就是生成器)
days = ["deleted", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]

position = 3

for i,day in enumerate(filter(lambda x: x != 'deleted', days)):
  if i == position: break
  print(i+1, day)