簡體   English   中英

如何按每個元素中的特定字符對列表進行排序?

[英]How do I sort a list by specific characters within each element?

我被要求定義一個基於文件擴展名對列表進行排序的函數。

我了解排序,但不了解如何從“”開始排序。 字符。

我想要以下結果:

>>> extsort(['a.c', 'a.py', 'b.py', 'bar.txt', 'foo.txt', 'x.c'])
['a.c', 'x.c', 'a.py', 'b.py', 'bar.txt', 'foo.txt']

您可以將鍵函數作為參數傳遞給sorted

>>> l = ['a.c', 'a.py', 'b.py', 'bar.txt', 'foo.txt', 'x.c']
>>> sorted(l, key=lambda x: splitext('.')[1])
['a.c', 'a.py', 'b.py', 'bar.txt', 'foo.txt', 'x.c']

如果您需要按文件名對具有相同擴展名的文件進行排序,則可以更改鍵功能以反轉拆分結果:

>>> l = ['x.c', 'a.py', 'b.py', 'bar.txt', 'foo.txt', 'a.c']
>>> sorted(l, key=lambda x: splitext(x)[::-1])
['a.c', 'x.c', 'a.py', 'b.py', 'bar.txt', 'foo.txt']

因為即使其中的一些文件不具有擴展名的作品(和稍微有些自我記錄)的解決方案,使用os.path.splitext作為一部分sortedkey功能。 如果沒有文件擴展名,它將擴展名視為空字符串'' ,並在所有其他擴展名之前進行排序:

>>> l = ['b.py', 'a.c', 'a.py', 'bar.txt', 'foo.txt', 'x.c', 'foo']
>>> sorted(l, key=lambda x: os.path.splitext(x)[1])
['foo', 'a.c', 'x.c', 'b.py', 'a.py', 'bar.txt', 'foo.txt']

請注意, b.py在此之前在a.py之前排序,因為它首先出現在輸入中,並且排序僅在文件擴展名上鍵入。 要按擴展名(然后是全名)排序,請在擴展名的元組上鍵入后跟非擴展名(通過使用[::-1]分割os.path.splitext的返回值很容易做到,這會顛倒順序返回的元素),所以a.py先於b.py不管它們出現在輸入其中:

>>> sorted(l, key=lambda x: os.path.splitext(x)[::-1])
['foo', 'a.c', 'x.c', 'a.py', 'b.py', 'bar.txt', 'foo.txt']

暫無
暫無

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

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