3 回答
TA贡献1828条经验 获得超3个赞
您可以使用该函数sorted()并为其提供 lambda 键。在这种情况下,我们将保持它们相同的顺序,但将包含的内容移到target_str顶部:
file_list = [
'Testcase/result.log',
'Testcase/system/system.log',
'Testcase/data/database.log',
'Testcase/mem/mem.log',
'Testcase/cashe/cashe.log',
]
print(
sorted(file_list, key=lambda f:[target_str not in f, file_list.index(f)])
)
# [
# 'Testcase/mem/mem.log',
# 'Testcase/result.log',
# 'Testcase/system/system.log',
# 'Testcase/data/database.log',
# 'Testcase/cashe/cashe.log'
# ]
如果key函数sorted()返回列表或元组,则元素按该顺序优先排序。首先,排序target_str not in f(False排序之前True,所以如果文件名确实包含目标字符串,它将排在第一位)。然后,如果出现平局,则按文件名的索引进行排序。
如果您有一个非常大的文件列表,那么您可能需要进行排序enumerate(file_list),以获取每个文件的索引,而不必.index()每次都调用。.index()价格昂贵。
TA贡献1811条经验 获得超5个赞
假设您只想重新排列路径,包括target_dir到顶部。您可以过滤包含其余路径target_dir并与其余路径合并
data = [
'Testcase/result.log',
'Testcase/system/system.log',
'Testcase/data/database.log',
'Testcase/mem/mem.log',
'Testcase/cashe/cashe.log',
]
target_dir = 'mem'
target = [item for item in data if target_dir in item]
rest = [item for item in data if item not in target]
res = [*target, *rest]
print(res)
TA贡献1829条经验 获得超7个赞
在这里排序不是一个好主意。而是使用OrderedDict。
file_list = ["Testcase/result.log",
"Testcase/system/system.log",
"Testcase/data/database.log",
"Testcase/mem/mem.log",
"Testcase/cashe/cashe.log"]
d = {}
from collections import OrderedDict
keys = list(map(lambda x:x.split("/")[-1].strip(".log"), file_list))#I took the <text>.log the text as the key
d = OrderedDict(zip(keys,file_list))
text = "mem"
d.move_to_end(text, last=False)
print(d)
list(d.values())完成流程后即可使用。
添加回答
举报