Python 如何使用列表理解来简化多个列表和字符串的排序和添加?

Python 如何使用列表理解来简化多个列表和字符串的排序和添加?,python,string,sorting,directory,list-comprehension,Python,String,Sorting,Directory,List Comprehension,下面的循环将获取目录和/或图像列表,并返回图像列表,包括所提供目录中的图像。对于给定的每个目录,在将图像添加到列表之前,它会验证每个文件是否确实是有效的图像 import os import argparse parser = argparse.ArgumentParser() parser.add_argument("-style_image", help="List of images and/or directories") params = parser.parse_args() st

下面的循环将获取目录和/或图像列表,并返回图像列表,包括所提供目录中的图像。对于给定的每个目录,在将图像添加到列表之前,它会验证每个文件是否确实是有效的图像

import os
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-style_image", help="List of images and/or directories")
params = parser.parse_args()

style_image_input = params.style_image.split(',')
valid_ext, style_input_sorted = [".jpg",".png"], None
for image in style_image_input:
    if os.path.isdir(image):
        for file in os.listdir(image):
            print(file)
            ext = os.path.splitext(file)[1]
            if ext.lower() not in valid_ext:
                continue
            if style_input_sorted == None:
                style_input_sorted = file
            else: 
                style_input_sorted += "," + file
    else:
        if style_input_sorted == None:
            style_input_sorted = image
        else: 
            style_input_sorted += "," + image 
style_image_list = style_input_sorted.split(',')
print(style_image_list)
如何使用列表理解来简化此循环

忘了“我怎样才能把它变成一个列表理解”。从“如何简化这个”开始。如果最后用一个或两个子句和一个简单的表达式进行循环,那么你可以考虑把它变成一个列表理解,但这是最后的步骤,而不是开始的目标。
大部分重复都是在构建
样式\u输入\u排序的方式中进行的:

  • 将其设置为
    None
  • 每次获得值时,如果该值为
    None
    ,请将其设置为该值
  • 否则,请添加逗号,然后添加值
您可以从
开始,而不是从
无开始,然后执行以下操作:

if style_input_sorted:
    style_input_sorted += ","
style_input_sorted += file

但是,更简单的是:你所做的是同一件事。join已经知道怎么做了。如果您可以建立一个字符串列表,然后在末尾加入该列表,那么会简单得多:

style_input_sorted = []
if …
    for …
        style_input_sorted.append(file)
else …
    style_input_sorted.append(file)
style_input_sorted = ",".join(style_input_sorted)

但是看起来你对
style\u-input\u-sorted
所做的唯一一件事就是把它重新拆分成一个列表。那么,为什么连一根绳子都要连在一起只是为了把它分开呢

style_input_list = []
if …
    for …
        style_input_list.append(file)
else …
    style_input_list.append(file)

你还可以做一些其他的简化,但这是最大的简化,它将为下一个简化打开大门。例如,现在您只需要做一件琐碎的事情,而不是为有效扩展编写四行代码,您可能可以摆脱
continue

if os.path.isdir(image):
    for file in os.listdir(image):
        ext = os.path.splitext(file)[1]
        if ext.lower() in valid_ext:
            style_input_list.append(file)
else:
    style_input_list.append(file)

现在我们有了一个可以转化为列表理解的片段,尽管我会使用生成器表达式:

if os.path.isdir(image):
    images = (file for file in os.listdir(image)
              if os.path.splitext(file)[1].lower() in valid_ext)
    style_input_list.extend(images)
else:
    style_input_list.append(image)
但是,把整个事情变成一个清单将是可怕的丑陋。你可以使用三元
if
将其转化为一个表达式,并在最后将整个内容展平,但如果你有五行代码,那就不属于理解范围。(当然,您可以将这五行分解成一个函数,然后将对该函数的调用包装成一个理解,这可能值得一做。)

忘记“如何将其转化为列表理解”。从“如何简化这个”开始。如果最后用一个或两个子句和一个简单的表达式进行循环,那么你可以考虑把它变成一个列表理解,但这是最后的步骤,而不是开始的目标。
大部分重复都是在构建
样式\u输入\u排序的方式中进行的:

  • 将其设置为
    None
  • 每次获得值时,如果该值为
    None
    ,请将其设置为该值
  • 否则,请添加逗号,然后添加值
您可以从
开始,而不是从
无开始,然后执行以下操作:

if style_input_sorted:
    style_input_sorted += ","
style_input_sorted += file

但是,更简单的是:你所做的是同一件事。join已经知道怎么做了。如果您可以建立一个字符串列表,然后在末尾加入该列表,那么会简单得多:

style_input_sorted = []
if …
    for …
        style_input_sorted.append(file)
else …
    style_input_sorted.append(file)
style_input_sorted = ",".join(style_input_sorted)

但是看起来你对
style\u-input\u-sorted
所做的唯一一件事就是把它重新拆分成一个列表。那么,为什么连一根绳子都要连在一起只是为了把它分开呢

style_input_list = []
if …
    for …
        style_input_list.append(file)
else …
    style_input_list.append(file)

你还可以做一些其他的简化,但这是最大的简化,它将为下一个简化打开大门。例如,现在您只需要做一件琐碎的事情,而不是为有效扩展编写四行代码,您可能可以摆脱
continue

if os.path.isdir(image):
    for file in os.listdir(image):
        ext = os.path.splitext(file)[1]
        if ext.lower() in valid_ext:
            style_input_list.append(file)
else:
    style_input_list.append(file)

现在我们有了一个可以转化为列表理解的片段,尽管我会使用生成器表达式:

if os.path.isdir(image):
    images = (file for file in os.listdir(image)
              if os.path.splitext(file)[1].lower() in valid_ext)
    style_input_list.extend(images)
else:
    style_input_list.append(image)

但是,把整个事情变成一个清单将是可怕的丑陋。你可以使用三元
if
将其转化为一个表达式,并在最后将整个内容展平,但如果你有五行代码,那就不属于理解范围。(当然,您可以将这五行代码分解成一个函数,然后将对该函数的调用包装成一个理解,这可能值得一做。)

您不能这样做。为什么你会考虑把一个16行的长循环变成一个列表理解?因为有重复的模式,好像它们可以让我简化代码,所以它使用更少的行。你不能。为什么你会考虑把一个16行长循环变成一个列表理解?因为有重复的模式,好像它们可以让我简化代码,所以它使用更少的行。谢谢帮助!这个函数实际上是基于一些Lua代码的,我不久前写的,当时我不太擅长编码。谢谢你的帮助!这个函数实际上是基于我不久前编写的一些Lua代码,当时我并不擅长编码。