Python:If语句在生成器的列表理解中
Python 3.6 考虑以下代码: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
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]]
太棒了!我知道一定有办法!