首页 > 解决方案 > 如何根据特定数据集在 Python 中对数组进行排序

问题描述

我正在使用 Python,并且在数组列表中有以下目录和文件,如下所示:

file_list = []
for file in file_list:
    print(file)

输出如下所示,没有特定的顺序。

Testcase/result.log
Testcase/system/system.log
Testcase/data/database.log
Testcase/mem/mem.log
Testcase/cashe/cashe.log

现在,我有另一个名为的 Python 字符串target_str,它可以具有随机值,例如'mem'or 'database'。在这种情况下,如果与内容target_str条目匹配,则应更改数组file_list的顺序,将匹配的值放在第一位。file_list

例如:

target_str = 'mem'

    Testcase/mem/mem.log   [Note: this entry moves at the first position since it matches the 'target_str']    
    Testcase/result.log
    Testcase/system/system.log
    Testcase/data/database.log
    Testcase/cashe/cashe.log 

想知道如何file_list根据 的值对条目进行排序target_str

标签: python

解决方案


您可以使用该函数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函数 forsorted()返回一个列表或元组,则元素按该顺序优先排序。首先,排序target_str not in fFalse排序之前True,所以如果文件名确实包含目标字符串,它会排在第一位)。然后,在平局的情况下,按文件名的索引排序。


如果您有一个非常大的文件列表,那么您可能希望改为排序enumerate(file_list),以获取每个文件的索引,而不必.index()每次都调用。.index()太贵了。


推荐阅读