python 中的订购链接

Ordering links in python

我有一个包含一些链接的列表:["http://link1.rar", "http://link1.rev","http://link2.rar", “http://link2.rev”] 有没有办法对它们进行排序,以便看起来像: ["http://link1.rar", "http://link2.rar", "http://link1.rev", "http://link2.rev"]

我试过这个:

def order(x):
    if "rar" not in x:
        return x
    else:
        return ""

new_links = sorted(links, key=order)

但在这种方式下,rev 链接是从最高排序的。

你要根据多个标准来解决:第一,文件扩展名;然后,整个字符串。

根据多个条件进行排序的常用技巧是使用元组作为键。元组按字典顺序排序,这意味着第一个条件先比较;如果平局,则比较第二个标准。

例如,下面的键 returns 一个元组,例如 (False, 'http://link1.rar')(True, 'http://link1.rev'):

new_links = sorted(links, key=lambda x: ('rar' not in x, x))

或者,您可以使用 str.rsplit 拆分最后一个 '.' 上的字符串并得到一个元组,例如 ('http://link1', 'rev')。既然你希望扩展是第一个标准,那么使用切片 [::-1] 来反转元组的顺序:

new_links = sorted(links, key=lambda x: x.rsplit('.', maxsplit=1)[::-1])

请注意,在最后一个 '.' 上使用 rsplit('.', maxsplit=1) 拆分有点麻烦。如果文件名包含双重扩展名,例如 '.tar.gz',则只会隔离最后一个扩展名。

最后一点要考虑:字符串中的数字。只要您的字符串仅包含单个数字,例如 '1''2',就可以按预期对字符串进行排序。但是,如果你在那里的某个地方有一个 'link10',顺序可能不是你期望的顺序:按字典顺序,'link10' 出现在 'link2' 之前,因为 '10' 的第一个字符是 '1'。在那种情况下,我建议你参考这个相关问题:Is there a built in function for string natural sort?