Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在匹配模式后,如何根据预定义的顺序对文件名列表进行排序?_Python_List_Sorting_Arcpy - Fatal编程技术网

Python 在匹配模式后,如何根据预定义的顺序对文件名列表进行排序?

Python 在匹配模式后,如何根据预定义的顺序对文件名列表进行排序?,python,list,sorting,arcpy,Python,List,Sorting,Arcpy,我正在尝试对光栅列表进行排序(光栅) 基于模式匹配和预定义顺序(ras\u顺序) 我遵循这一点,但它没有给我我想要的。感谢您的帮助。谢谢 预期产出: [u'example\my_ditch.tif',u'example\alt_canal.tif',u'example\main_entrance.tif',u'example\back_garden.tif',u'example\ne_lawn.tif'] 示例代码: import os import arcpy arcpy.CheckOutE

我正在尝试对光栅列表进行排序(
光栅

基于模式匹配和预定义顺序(
ras\u顺序

我遵循这一点,但它没有给我我想要的。感谢您的帮助。谢谢

预期产出:

[u'example\my_ditch.tif',u'example\alt_canal.tif',u'example\main_entrance.tif',u'example\back_garden.tif',u'example\ne_lawn.tif']

示例代码:

import os
import arcpy

arcpy.CheckOutExtension("Spatial")  

# set project directory
working_dir = os.path.expanduser('~/Documents/')
scenario = 'example'
env.workspace = os.path.join(working_dir, scenario)

# predefined order
ras_order = ['ditch', 'canal', 'entrance', 'garden', 'lawn']

# find rasters in the working_dir 
rasters = []  
walk = arcpy.da.Walk(os.path.join(working_dir, scenario), topdown=True, datatype="RasterDataset")  
for dirpath, dirnames, filenames in walk:  
    for filename in filenames:  
        rasters.append(os.path.join(dirpath, filename))  

print(rasters)

# [u'example\\alt_canal.tif', u'example\\back_garden.tif', u'example\\main_entrance.tif', u'example\\my_ditch.tif', u'example\\ne_lawn.tif']

# sort based on predefined order (not working)
new_order1 = [x for _, x in sorted(zip(ras_order, rasters))]
print(new_order1)

# [u'example\\back_garden.tif', u'example\\alt_canal.tif', u'example\\main_entrance.tif', u'example\\my_ditch.tif', u'example\\ne_lawn.tif']
除了@Lante的答案,还有另一种方法:

new_raster = []
for i in ras_order:
    for j in rasters:
        if i in j:
            new_raster.append(j)
new_raster

[u'example\\\\Max (dec).my_ditch.tif',
 u'example\\\\Max (dec).alt_canal.tif',
 u'example\\\\Max (dec).main_entrance.tif',
 u'example\\\\Max (dec).back_garden.tif',
 u'example\\\\Max (dec).ne_lawn.tif']

这是一个简单的解决方案,将使用正则表达式进行优化,以实现更精确的匹配:

rasters = ["example\\\\alt_canal.tif", "example\\\\back_garden.tif", "example\\\\main_entrance.tif", "example\\\\my_ditch.tif", "example\\\\ne_lawn.tif"]
ras_order = ["ditch", "canal", "entrance", "garden", "lawn"]

def ras_match(r, o):
    return next(i for i, x in enumerate(o) if x in r)

sorted(rasters, key=lambda x: ras_match(x, ras_order))
输出:

['example\\\\my_ditch.tif',
 'example\\\\alt_canal.tif',
 'example\\\\main_entrance.tif',
 'example\\\\back_garden.tif',
 'example\\\\ne_lawn.tif']
rasters = ["example\\\\alt_canal.tif", "example\\\\back_garden.tif", "example\\\\main_entrance.tif", "example\\\\my_ditch.tif", "example\\\\ne_lawn.tif"]
ras_order = ["ditch", "canal", "entrance", "garden", "lawn"]

def ras_match(r, o):
    return next(i for i, x in enumerate(o) if x in r)

sorted(rasters, key=lambda x: ras_match(x, ras_order))
['example\\\\my_ditch.tif',
 'example\\\\alt_canal.tif',
 'example\\\\main_entrance.tif',
 'example\\\\back_garden.tif',
 'example\\\\ne_lawn.tif']