【问题标题】:How to skip item in list in python?如何在python中跳过列表中的项目?
【发布时间】:2021-06-27 02:19:10
【问题描述】:

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

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


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

没有抛出错误,我只是没有得到我想要的输出。我知道我的逻辑一定有缺陷,如果有人可以提供帮助,我将不胜感激。

【问题讨论】:

    标签: python list filter enumerate skip


    【解决方案1】:

    问题是您已经在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)
    

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

    islice(iterable, position)
    

    表示返回可迭代的第一个 position 元素(在这种情况下,它是我们的生成器表达式)。结果是我们不会处理比我们需要的更多的元素,但我们能够在更少的行中实现相同的结果。

    【讨论】:

      【解决方案2】:

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

      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)
      

      【讨论】:

        【解决方案3】:

        使用生成器函数

        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)
        

        【讨论】:

          猜你喜欢
          • 2014-05-14
          • 2021-08-18
          • 2016-09-23
          • 2011-10-01
          • 1970-01-01
          • 1970-01-01
          • 2022-06-24
          • 2020-05-26
          • 1970-01-01
          相关资源
          最近更新 更多