具有嵌套列表的列表理解,如果语句和范围步骤

时间:2018-12-12 13:49:56

标签: python

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

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]结尾的list_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]是另一个可迭代的。 所以我的问题是如何在达到标准的情况下获得输出?

4 个答案:

答案 0 :(得分:1)

由于您的input_[i][2]是一个嵌套(嵌套)列表,因此您需要进行第二次迭代。因此,您需要在理解中遍历每个项目(我称它们为filename)。您也可以使用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)

两种方法都没什么区别。

答案 1 :(得分:1)

首先不要将Python内置变量用作变量名(代码中的for i in range(0,len(Holidays)-1): for j in range(0,len(df)-1): if (Holidays.loc[i,'month']==df.loc[j,'month'] and Holidays.loc[i,'day']==df.loc[j,'day'] ): df.loc[j,'Isholiday']=1 else: df.loc[j,'Isholiday']=0 )。其次,您想要将每个子列表的input与以item[0]结尾的子子列表(item[2])的项目连接在一起。然后从第2步开始,到第2步。所以您这样做:

"xml"

结果为:

lst = [["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", ...]], 
         ...]


res = []
for k, _, v in lst[2::2]:
    catch = next((g for g in v if g.endswith('.xml')), None)
    if catch is not None:
        res.append(k+catch)

答案 2 :(得分:0)

您的输出不正确,或者我可能理解不正确。...您能解释一下最终结果吗?

此外,在此处关闭括号,“ i”是数字:

count_it

答案 3 :(得分:0)

我了解您想使用一种理解。你去...

data = [["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"]]]

x = ["".join(d[:1] + [s for s in d[2] if ".xml" in s]) for d in data[2::2]]