Однострочный цикл for с использованием понимания списка

Кто-то предложил мне создать программу, которая сортирует фотографии по папкам в зависимости от месяца, когда они были сделаны, и я хочу сделать это в одну строку (знаю, это неэффективно и нечитабельно, но я все равно хочу это сделать, потому что один- лайнеры классные)

Для этого мне понадобился цикл for, но единственный известный мне способ использовать цикл for в одной строке — это понимание списка, вот что я сделал, но он создает пустой список и ничего не печатает из списка или что-нибудь.

Что я делаю, так это переименовываю файл в месяц создания + исходное имя файла (например: bacon.jpg --> May\bacon.jpg)

Вот мой код (Python 3.7.3):

import time
import os.path
[os.rename(str(os.fspath(f)), str(time.ctime(os.path.getctime(str(os.fspath(f))))).split()[1] + '\\' + str(os.fspath(f))) for f in os.listdir() if f.endswith('.jpg')]

и более читаемая версия без понимания списка:

import time
import os.path
for f in os.listdir():
    fn = str(os.fspath(f))
    dateCreated = str(time.ctime(os.path.getctime(fn)))
    monthCreated = dateCreated.split()[1]
    os.rename(fn, monthCreated + '\\' + fn)

Является ли понимание списка плохим способом сделать это? Кроме того, есть ли причина, по которой, если я напечатаю список, это [] вместо [None, None, None, None, None, (continuing "None"s for every image moved)]?

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

Если это просто печать [], вы уверены, что if f.endswith делает то, что вы хотите?

C.Nivs 28.05.2019 22:49

НЕ используйте понимание списка, если вы не планируете использовать результат, это не путь к одной строке цикла for. Вы НЕ должны одну строку эту проблему. Если хотите, можете использовать ;, но это плохая практика.

Error - Syntactical Remorse 28.05.2019 22:50

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

user2357112 supports Monica 28.05.2019 22:51

@Error-SyntacticalRemorse Это совершенно нормально для игры в гольф или для других целей.

ruohola 28.05.2019 22:52

@ruohola, чем просто использовать ;, чтобы написать несколько строк в одной. Понимание списка потребляет память для каждого цикла, в лучшем случае оно использует None для каждого вызова, в худшем случае каждый вызов возвращает большой объект, таким образом создавая большой временный список, который никогда не используется.

Error - Syntactical Remorse 28.05.2019 22:54

Эффективность понимания списков в первую очередь заключается в создании списка, сокращении шага lst.append(item) цикла. Если вы не пытаетесь создать список, то составление списка бессмысленно. Поскольку вы добавляете результат функции в список, а функция возвращает None, вы получаете список None

G. Anderson 28.05.2019 23:05

@C.Nivs перемещает изображения в соответствующую папку, поэтому я предполагаю, что все работает правильно.

rainbowkitty227 29.05.2019 00:01

@ user2357112, лол, хорошая метафора. Я согласен с вами, и теперь я понял, что мне нужно, чтобы моя программа была более сложной, поэтому я расширяю ее до нескольких строк.

rainbowkitty227 29.05.2019 00:03
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
8
228
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Является ли понимание списка плохим способом сделать это?

ДА. Но если вы хотите сделать это одной строкой, то либо так, либо с помощью ";". Например:

 for x in range(5): print(x);print(x+2)

И, кстати, простое переименование файла со слэшем не создаст папку. Вы должны использовать os.mkdir('foldername').

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

Ой, не догадался проверить, что папка уже есть и создать если нет, спасибо!

rainbowkitty227 28.05.2019 23:48

Это плохо сразу в двух отношениях:

  1. Вы используете понимание списка, когда на самом деле не заинтересованы в построении списка - вы игнорируете только что созданный объект.
  2. Ваша конструкция имеет уродливый побочный эффект в ОС.

Кажется, ваша цель - переименовать последовательность файлов, нет создав список. Я полагаю, что средство Python, которое вам нужно, — это функция map. Напишите функцию для изменения одного имени файла, а затем используйте map для списка имен файлов — или кортежей старых и новых имен файлов — для выполнения последовательности желаемых изменений.

извините, это могло быть очевидно в ответе, но каков побочный эффект?

rainbowkitty227 28.05.2019 23:50
rename — это побочный эффект: вы создаете список, и имена файлов волшебным образом меняются, пока вы это делаете.
Prune 29.05.2019 01:28
map не имеет побочных эффектов. Это для создания итераторов. Это не будет даже выполнять каких-либо побочных эффектов, если вы не используете итератор.
user2357112 supports Monica 29.05.2019 04:51

о, хорошо, это имеет смысл.

rainbowkitty227 29.05.2019 21:08

Другие вопросы по теме