簡體   English   中英

使用列表理解的單行“ 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)]

請注意:我知道這是低效率的做法,也是不好的做法。 如果我這樣做只是出於娛樂目的,而不是為了看看我是否可以做到,那么我顯然不會嘗試一味地做到這一點。

從兩個方面來講,這是不好的:

  1. 當您實際上對構造列表不感興趣時​​,便會使用列表推導-您會忽略剛構造的對象。
  2. 您的構造在操作系統中具有難看的副作用。

您的目的似乎是重命名文件序列, 而不是構造列表。 我相信,您想要的Python工具是map函數。 編寫一個函數來更改一個文件名,然后在文件名列表(或舊的,新的文件名的元組)上使用map來執行所需的更改序列。

列表理解是一種不好的方法嗎?

是。 但是,如果您想在一行中執行此操作,則可以使用“;”。 例如:

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

而且,順便說一句,僅重命名包含斜杠的文件將不會創建文件夾。 您必須使用os.mkdir('foldername')

最后,如果您真的想這樣做,我建議您通常在多行中執行此操作,然后在一行中用分號將其分開。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM