繁体   English   中英

Python 中具有许多循环的复杂列表理解

[英]Complicated list comprehension with many loop in Python

我目前正在做一些理解列表,并在增加循环数量的同时遇到问题。 到目前为止,我的代码如下:

selected_sheet_names = []
selected_sheet_names.append([x for x in sheet_names if x.endswith("b1")])
selected_sheet_names.append([x for x in sheet_names if x.endswith("b2")])
selected_sheet_names.append([x for x in sheet_names if x.endswith("b3")])

sheet_names列表包含不同的字符串,所有这些字符串都以b1b2b3结尾。 如果您想在代码中检查它们:

sheet_names = ['0.5C_1_b1', '0.5C_2_b1', '1C_1_b1', '1C_2_b1', '1C_3_b1', '1C_4_b1', '1C_5_b1', 
'0.11C_1_b2', '0.57C_1_b2', '1.14C_1_b2', '1.14C_2_b2', '1.14C_3_b2', '1.14C_4_b2', '1.14C_5_b2', 
'1.14C_6_b2', '1.14C_7_b2', '1.14C_8_b2', '1C_1_b3', '1C_2_b3', '1C_3_b3', '1C_4_b3', '1C_5_b3', 
'1C_6_b3', '1C_7_b3', '1C_8_b3']

如果我想print(selected_sheet_names) ,结果如下:

[
    ['0.5C_1_b1', '0.5C_2_b1', '1C_1_b1', '1C_2_b1', '1C_3_b1', '1C_4_b1', '1C_5_b1'], 
    ['0.11C_1_b2', '0.57C_1_b2', '1.14C_1_b2', '1.14C_2_b2', '1.14C_3_b2', '1.14C_4_b2', '1.14C_5_b2', '1.14C_6_b2', '1.14C_7_b2', '1.14C_8_b2'], 
    ['1C_1_b3', '1C_2_b3', '1C_3_b3', '1C_4_b3', '1C_5_b3', '1C_6_b3', '1C_7_b3', '1C_8_b3']
]

完全符合我的预期,但如果我想在第一个代码块中拥有更多x.endswith(some_string) ,代码会变得太大,因此,我认为我应该尝试更改selected_sheet_names.append([x for x in sheet_names if x.endswith(some_string)])对一些其他更复杂的列表理解重复多次,这些列表理解可以迭代some_list并做同样的事情。

some_list = ["b1", "b2", "b3" ... ]

有人可以给我一些建议吗?

编辑 1:我知道我可以用 for 循环来实现它,但在这个例子中,如果可能的话,我对理解实现列表特别感兴趣。 for循环可以如下:

selected_sheet_names = []
for ending in some_list:
    selected_sheet_names.append([x for x in sheet_names if x.endswith(ending)])

与您建议的表单匹配的简单嵌套 listcomp 将遍历字符串的匿名tuple以检查:

selected_sheet_names = [[x for x in sheet_names if x.endswith(some_string)]
                        for some_string in ("b1", "b2", "b3")]

如果您从其他地方获得some_list ,或者它太长而无法舒适地定义内联,您可以用some_list替换匿名tuple (如果它已经定义)。

或者,您可以使用内置intertools模块中的groupby

from itertools import groupby

selected_sheet_names = [list(l[1]) for l in groupby(sheet_names, lambda x: x[-1])]

它提供了更清晰、性能更好的代码,因为您不会重复多次不必要的时间

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM