【问题标题】:Two for-loops in a list comprehension列表理解中的两个 for 循环
【发布时间】:2018-07-12 09:54:41
【问题描述】:

对于一个项目,我想从指向文件的文档路径中取出单词并将它们返回到一个列表中。我可以通过使用列表推导、正则表达式和 for 循环来完成此操作:

for path, subdir, files in os.walk(directory):
    for file in files:
        themen = [x for x in re.findall(r'[^\W\d_]+',path)]
        themen_final = []
        for i in range(4,len(themen)):
            themen_final.append(themen[i])
        print(themen_final)

这很好用,但我敢肯定,可以将 for 循环 for i in range... 也放在上面的列表理解中。我该怎么做?

【问题讨论】:

  • 试试print([re.findall(r'[^\W\d_]+',path)[4:] for path, subdir, files in os.walk(directory)])
  • 或者,print([item for sublist in [re.findall(r'[^\W\d_]+',path)[4:] for path, subdir, files in os.walk(directory)] for item in sublist])
  • 我会选择最具可读性和易读性的版本。不管你走多少线:)
  • @belthazorNv 我完全同意你的看法。我只是对在列表理解中放置两个 for 循环的可能性感到好奇。

标签: regex python-3.x list-comprehension


【解决方案1】:

通过列表推导观察,for 循环的顺序与您通常编写它们的顺序相同。所以

for a in range(4):
    for b in a:
        pass

会变成

[pass for a in range(4) for b in a]

有了这些知识,将任何循环重写为推导式变得非常容易。你把末端放在前面,然后把for放在后面。因为您用themen_final = [] 列出了一个小列表,所以我们从以下开始:

for path, subdir, files in os.walk(directory):
    for file in files:
        themen_final = [themen for themen in re.findall(r'[^\W\d_]+',path)[:4]]

并再次使用相同的技巧来达到:

[[themen for themen in re.findall(r'[^\W\d_]+', path)[:4]] for file in files for path, _, files in os.walk(directory)]

尽管我什至希望您对re.findall(r'[^\W\d_]+', path + file) 感兴趣,或者您可以不使用for file in files。现在,您将始终为每个文件获得相同的结果。 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-04
    • 2023-03-11
    相关资源
    最近更新 更多