代码之家  ›  专栏  ›  技术社区  ›  tonydanza123

如果值不存在,则列表理解返回列表

  •  1
  • tonydanza123  · 技术社区  · 2 年前

    我的目标是使用列表理解来返回列表中的值。具体而言,如果 'x' 在列表中,我想删除所有其他值。但是,如果 'x' 不在列表中,我想返回相同的值(不返回空列表)。

    list1 = ['d','x','c']
    list2 = ['d','b','c']
    
    list1 = [s for s in list1 if s == 'x']
    list2 = [s for s in list2 if s == 'x']
    

    List2将返回 [] 。在我想要的地方 ['d','b','c']

    list2 = [s for s in list2 if s == 'x' else list2]
    

    退货:

    list2 = [s for s in list2 if s == 'x' else list2]
                                          ^^^^
    SyntaxError: invalid syntax
    
    2 回复  |  直到 2 年前
        1
  •  3
  •   OneCricketeer Gabriele Mariotti    2 年前

    这将保留所有不是x的元素

    list2 = [x for x in list2 if x != 'x']
    

    但是,如果x在列表中,它仍然会返回所有其他元素。

    因此,你需要两次检查x是否存在,因为单凭列表理解无法返回这些信息

    def filter_x(lst):
      if 'x' in lst:
        return [x for x in lst if x == 'x']
      else:
        return lst
    
        2
  •  1
  •   Kraigolas    2 年前

    这并不重要,但你可以更有效地做到这一点。 if 'x' in lst 将遍历该列表一次,然后您必须重新生成该列表。相反,假设 x 在列表中,并建立您的列表 x s

    tmp = [x for x in lst if x == 'x']
    

    然后,检查此列表中是否有元素。如果是,请使用它,否则将其设置为原始列表:

    tmp = tmp if len(tmp) > 0 else lst
    

    当然,这取决于您的用例/是否需要一个副本(这样您就不能更改原始列表)。如果您的计划是覆盖原始列表,请将第二行更改为:

    lst = tmp if len(tmp) > 0 else lst
    

    这只是遍历列表两次与一次的区别。