Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:If语句在生成器的列表理解中_Python_List_List Comprehension - Fatal编程技术网

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

Python:If语句在生成器的列表理解中,python,list,list-comprehension,Python,List,List Comprehension,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

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
筛选出列表吗

更新:

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

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
看起来清单理解有优势

列表理解由括号组成,括号中包含表达式,后跟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]]
或者,使用
过滤器
映射
列表

>>> 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]]

太棒了!我知道一定有办法!