我如何根据我提供的特定顺序进行排序
How can I sort given a specific order that I provide
我正在尝试根据文件的扩展名对目录中的文件进行排序,但提供了我首先给出的顺序。假设我希望延期订单为
ext_list = [ .bb, .cc , .dd , aa ]
我能想到的唯一方法是遍历每个文件
并在每次遇到特定扩展名时将它们放入列表中。
for subdir, dirs, files in os.walk(directory):
if file.endswith( '.bb') --> append file
then go to the end of the directory
then loop again
if file.endswith( '.cc') -->append file
and so on...
return sorted_extension_list
然后最后
for file in sorted_extension_list :
print file
您可以将 sorted()
与自定义密钥一起使用:
import os
my_custom_keymap = {".aa":2, ".bb":3, ".cc":0, ".dd":1}
def mycompare(f):
return my_custom_keymap[os.path.splitext(f)[1]]
files = ["alfred.bb", "butters.dd", "charlie.cc", "derkins.aa"]
print(sorted(files, key=mycompare))
以上使用mycompare函数作为自定义键比较。在本例中,它提取扩展名,然后在 my_custom_keymap
字典中查找扩展名。
一种非常相似的方式(但更接近您的示例)可以使用列表作为地图:
import os
my_custom_keymap = [".cc", ".dd", ".aa", ".bb"]
def mycompare(f):
return my_custom_keymap.index(os.path.splitext(f)[1])
files = ["alfred.bb", "butters.dd", "charlie.cc", "derkins.aa"]
print(sorted(files, key=mycompare))
import os
# List you should get once:
file_list_name =['mickey.aa','mickey.dd','mickey_B.cc','mickey.bb']
ext_list = [ '.bb', '.cc' , '.dd' , '.aa' ]
order_list =[]
for ext in ext_list:
for file in file_list_name:
extension = os.path.splitext(file)[1]
if extension == ext:
order_list.append(file)
order_list 就是您要找的。否则,您可以使用带有 key 属性的命令 sorted() 。只需在 SO 上寻找它!
这是另一种方法:
files = []
for _, _, f in os.walk('directory'):
files.append(f)
sorted(files,key=lambda x: ext_list.index(*[os.path.basename(x).split('.',1)[-1]]))
['buzz.bb', 'foo.cc', 'fizz.aa']
编辑:我的输出没有 dd
因为我没有在本地测试目录中为它创建文件。无论如何它都会起作用。
使用带有自定义键的 sorted
可能是最好的,但这是另一种方法,您可以根据扩展名将文件名存储在列表中。然后根据您的自定义顺序将这些列表放在一起。
def get_sorted_list_of_files(dirname, extensions):
extension_map = collections.defaultdict(list)
for _, _, files in os.walk(dirname):
for filename in files:
extension = os.path.splitext(filename)[1]
extension_map[extension].append(filename)
pprint.pprint(extension_map)
sorted_list = []
for extension in extensions:
sorted_list.extend(extension_map[extension])
pprint.pprint(extensions)
pprint.pprint(sorted_list)
return sorted_list
我正在尝试根据文件的扩展名对目录中的文件进行排序,但提供了我首先给出的顺序。假设我希望延期订单为
ext_list = [ .bb, .cc , .dd , aa ]
我能想到的唯一方法是遍历每个文件 并在每次遇到特定扩展名时将它们放入列表中。
for subdir, dirs, files in os.walk(directory):
if file.endswith( '.bb') --> append file
then go to the end of the directory
then loop again
if file.endswith( '.cc') -->append file
and so on...
return sorted_extension_list
然后最后
for file in sorted_extension_list :
print file
您可以将 sorted()
与自定义密钥一起使用:
import os
my_custom_keymap = {".aa":2, ".bb":3, ".cc":0, ".dd":1}
def mycompare(f):
return my_custom_keymap[os.path.splitext(f)[1]]
files = ["alfred.bb", "butters.dd", "charlie.cc", "derkins.aa"]
print(sorted(files, key=mycompare))
以上使用mycompare函数作为自定义键比较。在本例中,它提取扩展名,然后在 my_custom_keymap
字典中查找扩展名。
一种非常相似的方式(但更接近您的示例)可以使用列表作为地图:
import os
my_custom_keymap = [".cc", ".dd", ".aa", ".bb"]
def mycompare(f):
return my_custom_keymap.index(os.path.splitext(f)[1])
files = ["alfred.bb", "butters.dd", "charlie.cc", "derkins.aa"]
print(sorted(files, key=mycompare))
import os
# List you should get once:
file_list_name =['mickey.aa','mickey.dd','mickey_B.cc','mickey.bb']
ext_list = [ '.bb', '.cc' , '.dd' , '.aa' ]
order_list =[]
for ext in ext_list:
for file in file_list_name:
extension = os.path.splitext(file)[1]
if extension == ext:
order_list.append(file)
order_list 就是您要找的。否则,您可以使用带有 key 属性的命令 sorted() 。只需在 SO 上寻找它!
这是另一种方法:
files = []
for _, _, f in os.walk('directory'):
files.append(f)
sorted(files,key=lambda x: ext_list.index(*[os.path.basename(x).split('.',1)[-1]]))
['buzz.bb', 'foo.cc', 'fizz.aa']
编辑:我的输出没有 dd
因为我没有在本地测试目录中为它创建文件。无论如何它都会起作用。
使用带有自定义键的 sorted
可能是最好的,但这是另一种方法,您可以根据扩展名将文件名存储在列表中。然后根据您的自定义顺序将这些列表放在一起。
def get_sorted_list_of_files(dirname, extensions):
extension_map = collections.defaultdict(list)
for _, _, files in os.walk(dirname):
for filename in files:
extension = os.path.splitext(filename)[1]
extension_map[extension].append(filename)
pprint.pprint(extension_map)
sorted_list = []
for extension in extensions:
sorted_list.extend(extension_map[extension])
pprint.pprint(extensions)
pprint.pprint(sorted_list)
return sorted_list