使用列表理解的单行 "for" 循环

One-line "for" loop using list comprehension

有人挑战我创建一个程序,根据拍摄的月份将他们的照片分类到文件夹中,我想在一行中完成(我知道,它效率低下且不可读,但我仍然想这样做是因为单线很酷)

我需要一个 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)] 是有原因的吗?

请注意:我知道这是低效且不好的做法。如果我这样做的目的不是为了好玩,看看我是否能做到,我显然不会尝试在一行中完成。

列表理解是一种糟糕的方法吗?

是的。但是如果你想在一行中完成它,那就是或者使用“;”。例如:

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

另外,仅重命名包含斜杠的文件不会创建文件夹。你必须使用 os.mkdir('foldername').

最后,如果你真的想这样做,我只是建议在多行中正常进行,然后在一行中用分号分隔。

这在两个直接方面是不好的:

  1. 当您实际上对构建列表不感兴趣时​​,您正在使用列表理解——您忽略了刚刚构建的对象。
  2. 你的构造在 OS 中有一个丑陋的副作用。

您的目的似乎是重命名一系列文件,而不是构建列表。我相信,您想要的 Python 功能是 map 功能。编写一个函数来更改一个文件名,然后在文件名列表上使用 map - 或旧文件名、新文件名的元组 - 通过所需的更改序列到 运行。