使用lambda的复杂排序

时间:2016-02-10 05:17:37

标签: python lambda

有没有办法使用lambda表达式执行以下python sort

sorted_urls = []
for url in all_urls:
    if '/en-' in url:
        sorted_urls.insert(0, url)
    else:
        sorted_urls.append(url)

second_sorted_urls = []
for url in sorted_urls:
    if '/season-' not in url:
        second_sorted_urls.insert(0, url)
    else:
        second_sorted_urls.append(url)

换句话说,我想按以下方式对其进行排序:'season-' not in url ASC,'en' in url ASC

3 个答案:

答案 0 :(得分:2)

是。元组依次按每个元素自然排序,而布尔值排序new_branch_name,所以只需使用lambda给出一个元组键:

False < True

布尔值被反转,因为sorted_urls = sorted(all_urls, key=lambda x: ('season-' in x, 'en' not in x)) 值将被排序到排序列表的开头。您也可以使用False

答案 1 :(得分:1)

不确定这是否是您问题的焦点,但由于{{1},您的代码似乎具有Ω(n 2 的复杂性}}。由于排序,您提出的解决方案具有Θ(log(n))复杂性。实际上,这可以通过 O(n)时间来完成。

假设您对以下4个列表使用列表解析。

insert(0, ...)

您现在可以轻松地以任何您喜欢的方式附加它们。

答案 2 :(得分:0)

您正在寻找的内容是filter。 Sorted将仅对默认情况下已存在的内容进行排序。

urls = ['these', 'are', 'my/en', 'test', 'urls/en']
sorted_urls_without_en = sorted(filter(lambda x: '/en' not in x, urls))
# ['are', 'test', 'these']

然后您可以对它们进行排序。