Как использовать списки, чтобы упростить сортировку и добавление нескольких списков и строк? - PullRequest
0 голосов
/ 29 апреля 2018

В приведенном ниже цикле будет взят список каталогов и / или изображений, и он вернет список изображений, включая изображения в поставляемых каталогах. Перед каждым указанным каталогом перед добавлением этого изображения в список он проверяет, что каждый файл действительно является допустимым изображением.

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)

Как я могу использовать списки, чтобы упростить этот цикл?

1 Ответ

0 голосов
/ 29 апреля 2018

Забудьте о том, «как я могу превратить это в понимание списка». Начните с «как я могу упростить это». Если, в конце концов, вы переходите к циклу с одним или двумя предложениями и простым выражением, тогда вы можете рассмотреть возможность превращения этого в понимание списка, но это последний шаг, а не начальная цель.


Большая часть вашего повторения заключается в том, как вы строите style_input_sorted:

  • Установите значение None.
  • Каждый раз, когда вы получаете значение, если оно None, присвойте ему значение
  • В противном случае добавьте запятую, а затем добавьте значение.

Вместо того, чтобы начинать с None, вы можете начать с "", а затем сделать это:

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

Но, еще проще: то, что вы делаете - это одно и то же str.join уже знает, как это сделать. Если вы можете создать список строк, а затем просто 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_input_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 и сгладить все в конце, но если у вас есть пять строк кода, это не относится к пониманию. (Конечно, вы можете выделить эти пять строк в функцию, а затем обернуть вызов этой функции в понимание, которое, возможно, стоит сделать.)

...