簡體   English   中英

在 Python 中對列表進行分區

[英]Partitioning a list in Python

我想了解如何修改列表的內容,特別是os.listdir()返回的文件名。

文件名由多個重復的名稱組成,后跟一個下划線,然后是后綴,然后是文件擴展名。 我試圖將列表中的元素縮減為文件名的第一部分,在'_'之前,所以:

apple_d.jpg
apple_si.jpg
apple_sg.jpg

成為列表中的一個條目, 'apple'

我能夠擺脫重復並重新按字母順序排列

list(sorted(set(t)))

但是從下划線開始刪除所有內容被證明是棘手的。 我試圖通過.rpartition("_")[0]做到這一點。 但這顯然不適用於列表。 所以我想知道如何解決這個問題?

編輯:好吧,不在這里工作。 仍然得到重復,沒有分裂。

objects = os.listdir(dir)





    for object in objects:
        sorted(set(object.split('_', 1)[0]))
        cmds.menuItem(label = object, parent = "objectMenu")

(最后一個命令是一個 Maya 命令,它填充一個選項菜單)。 現在很累,所以我得稍后再接再厲。 但是非常感謝迄今為止的幫助。 肯定很快就會得到這個。

使用帶限制的str.split()str.rsplit() ,然后選擇第一個元素:

filename.split('_', 1)[0]

.rsplit('_', 1)將在最后一個下划線拆分, .split()在第一個下划線拆分。 選擇最適合您用例的那個。

這將為您提供該文件名的第一個或最后一個下划線之前的所有內容。

在集合理解中使用它, sorted()從該集合中返回一個列表:

unique_prefixes = sorted({filename.split('_', 1)[0] for filename in os.listdir(somedir)})

對於 Python 2.6 及更早版本,您還沒有集合理解語法,以下帶有set()的生成器表達式也可以工作:

unique_prefixes = sorted(set(filename.split('_', 1)[0] for filename in os.listdir(somedir)))

根據我對問題的理解,您嘗試直接在列表上調用rpartition (可能像os.listdir('path').rpartition('_')[0] )。 我相信要以您想要的方式使用rpartition ,您需要將其應用於列表的各個元素。 列表推導是最推薦的方法:

file_prefixes = [f.rpartition('_')[0] for f in os.listdir('path')]

正如 Martijin Pieters 所建議的那樣,將其變成一個集合理解將消除重復:

file_prefixes = {f.rpartition('_')[0] for f in os.listdir('path')}

注意:這實際上應該等同於 Martijin Pieters 的答案,只是使用問題中提到的rpartition而不是rsplit (基本上為您節省了1參數。)

這對我有用-

labels = os.listdir(dir)




labels_processed=[]
for label in labels:
    labels_processed.append(label.split('_')[0])



labprocessed  = set(labels_processed)



for finallab in labprocessed:        
    cmds.menuItem(label = finallab, parent = "objectMenu")

干杯,

年代托澤

Martjin引用的答案,但我沒有使用 split,而是使用了 rpartition,因為它特別有興趣在最后一次出現搜索字符串/字符之前比較字符串的第一部分 -

if x not in sorted({filename.rpartition(' - ')[0] for filename in os.listdir(somedir)}):
     some action...

暫無
暫無

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

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