代码之家  ›  专栏  ›  技术社区  ›  James Schinner

Python:生成器上列表理解中的If语句

  •  1
  • James Schinner  · 技术社区  · 9 年前

    Python 3.6

    from itertools import groupby
    
    result = [list(group) for key, group in groupby(range(5,15), key= lambda x: str(x)[0])]
    
    print(result)
    

    输出:

    [[5], [6], [7], [8], [9], [10, 11, 12, 13, 14]]
    

    len < 2 在列表中理解?

    更新:

    由于给出了两个极好的答案。我觉得这可能值得一个基准

    import timeit
    
    t1 = timeit.timeit('''
    from itertools import groupby
    result = [group_list for group_list in (list(group) for key, group in groupby(range(5,15), key= lambda x: str(x)[0])) if len(group_list) >= 2]
    ''', number=1000000)
    print(t1)
    
    t2 = timeit.timeit('''
    from itertools import groupby
    list(filter(lambda group: len(group) >= 2, map(lambda key_group: list(key_group[1]),groupby(range(5,15), key=lambda x: str(x)[0]))))
    ''', number=1000000)
    print(t2) 
    

    结果:

    8.74591397369441
    9.647086477861325
    

    1 回复  |  直到 9 年前
        1
  •  3
  •   rampion    9 年前

    Yes

    列表理解由括号组成,括号中包含一个表达式,后跟for子句,然后是零个或多个for或if子句。结果将是一个新的列表,该列表是在其后的for和if子句的上下文中对表达式求值得到的。例如,如果两个列表的元素不相等,则此listcomp将其组合:

    >>> [(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]
    [(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
    

    >>> combs = []
    >>> for x in [1,2,3]:
    ...     for y in [3,1,4]:
    ...         if x != y:
    ...             combs.append((x, y))
    ...
    >>> combs
    [(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
    

    请注意,for和if语句的顺序在这两个代码段中是如何相同的。

    list(group) groupby ),您可以使用生成器表达式在列表理解中引入临时变量:

    >>> [group_list for group_list in (list(group) for key, group in groupby(range(5,15), key= lambda x: str(x)[0])) if len(group_list) >= 2]
    [[10, 11, 12, 13, 14]]
    

    或者,使用 filter map list :

    >>> list(\
    ...   filter(lambda group: len(group) >= 2,\
    ...     map(lambda key_group: list(key_group[1]),\
    ...       groupby(range(5,15), key=lambda x: str(x)[0])\
    ...     )\
    ...   )\
    ... )
    [[10, 11, 12, 13, 14]]
    
    推荐文章