首页 > 解决方案 > 具有嵌套列表、if 语句和范围步骤的列表理解

问题描述

我有一个具有以下语法的列表:

list_in = [["Text1","", ["Text2.xml", "Text2.png", ...]], 
         ["Text3", "", ["Text4.xml", "Text4.png", ...]], 
         ["Text5","", ["Text6.xml", "Text6.png", ...]], 
         ["Text7", "", ["Text8.png", "Text8.xml", ...]], 
         ["Text9", "", ["Text10.png", "Text10.xml", ...]], 
         ...]

我想要的输出是一个list_in[i][0]list_in[i][2]iflist_in[i][2]连接的列表,".xml"以 list_in[2] 开始,遵循 2 的步骤。

给定上面的例子:list_out = ["Text5Text6.xml", "Text9Text10.xml"]

我尝试了以下代码:

list_out = [list_in[i][0] + list_in[i][2] for i in range(2, len(input), 2) if i.endswith(".xml")]

但它不起作用,因为它list_in[i][2]是另一个可迭代的。所以我的问题是如何在给定标准的情况下获得输出?

标签: python

解决方案


input_[i][2]由于您是嵌套(嵌套)列表,因此您需要在理解中进行第二次迭代。filename因此,您需要在您的理解中遍历每个项目(我将它们称为s)。您还可以使用 for 循环遍历它们。

一些小错误包括后面缺少括号i.endswith(".xml",因为iint,所以它没有endswith功能。

>>> output = [input_[i][0] + filename 
                for i in range(2, len(input_), 2)
                  for filename in input_[i][2]
                    if filename.endswith(".xml")]
>>> output
['Text5Text6.xml', 'Text9Text10.xml']

正如我之前提到的,不要input用作变量名。我使用input_它只是为了清楚这一点。


这是一个纯粹的单行黑客(或多行,如果你选择)。如果您希望选择更具可读性的内容,请考虑将您的理解分解为循环块。

output = []
for i in range(2, len(input_), 2):
  for filename in input_[i][2]:
    if filename.endswith(".xml"):
      output.append(input_[i][0] + filename)

两种方式都没有太大区别。


推荐阅读