python - 复杂的列表理解与 Python 中的许多循环

标签 python lambda list-comprehension

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

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

如果我想打印(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)])

编辑 2(感谢 Pedro Maia):

如果数据是连续的(但我不是这种情况),您可以使用:

from itertools import groupby

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

糟糕的是,我向您展示了一个连续的列表。如果您的数据不连续,输出可能如下所示:

[
    ['0.11C_1_b2'], 
    ['0.5C_1_b1'], 
    ['0.57C_1_b2'], 
    ['0.5C_2_b1', '1C_1_b1', '1C_2_b1', '1C_3_b1', '1C_4_b1', '1C_5_b1'], 
    ['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']
]

但是,如果你的数据是连续的,这个方法似乎更好

谢谢大家的回复!

最佳答案

与您建议的形式匹配的简单嵌套 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,或者它变得太长而无法舒适地定义内联,您可以将匿名 tuple 替换为 some_list如果它已经被定义。

关于python - 复杂的列表理解与 Python 中的许多循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70105142/

相关文章:

python - 使用所有可能的组合创建字符串

python - Flask,无法分配请求的地址

Java 8 List<Map<String, Object>> 到 List<Map<String, Object>> 按键分组并按值计数

python - 有没有办法使用列表理解来计算特定条件下按元素分组的频率,但不计算其他元素的频率?

匹配所有内容的python列表

生成器的 Python 循环行为

python - 从 Django 1.4 升级到 1.6 后在管理中保存对象时列出索引超出范围错误

javascript - 我如何使用 Lambda 函数以 JSON 进行响应

c# - Lambda 属性名称和数组索引

python - 使用列表理解交换行和列