如何跳过 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"
。
一个更短(但仍然同样有效)的过程是使用 filter
和 itertools.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)
我有一个字符串列表。我想遍历它们并只打印前三项。但是,如果其中一项相当于“已删除”,那么我想跳过该项目并打印下一项(只要它不等于“已删除”)。
换句话说,我想过滤掉一个我不想要的字符串,并在列表中打印前三项。这是我的代码:
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"
。
一个更短(但仍然同样有效)的过程是使用 filter
和 itertools.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)