使用lambda和ignore前缀对字符串列表进行排序

时间:2017-11-20 22:00:38

标签: python python-2.7 list sorting lambda

我试图对列表进行排序但忽略前缀。这个问题已经回答here。它应该是直截了当的,只是它不起作用。这就是我所拥有的:

def sort_it(lst, ignore):

  return lst.sort(key=lambda x: x.strip(ignore))

myList = ["cheesewhiz", "www.cheese.com", "www.wagons.com", "www.apples.com", "www.bananas.com"]

ignoreThis = "www."
sort_it(myList, ignoreThis)
print myList

只有排序混淆了,因为第一项没有任何要忽略的字符串的一部分。我不确定是否添加检查以查看字符串是否包含ignore字符串是使用Lambda的Pythonic方法。

我希望结果按字母顺序忽略www。

www.apples.com
www.bananas.com
www.cheese.com
cheesewhiz
www.wagons.com

1 个答案:

答案 0 :(得分:3)

strip不起作用。它将尝试去除传递的参数的每个字符,因此可能超过您传递的字符串。此外,您正在就地排序,无需返回None(或使用sorted来对参数的副本进行排序,这可能不会给来电者带来惊喜)

您可能希望str.replace取消www.re.sub("^www.","",x)

def sort_it(lst, ignore):
  lst.sort(key=lambda x: x.replace(ignore,""))

myList = ["cheesewhiz", "www.cheese.com", "www.wagons.com", "www.apples.com", "www.bananas.com"]

ignoreThis = "www."
sort_it(myList, ignoreThis)
print(myList)

结果:

['www.apples.com', 'www.bananas.com', 'www.cheese.com', 'cheesewhiz', 'www.wagons.com']

更准确地说,如果您想从密钥中删除www.,只有以www.开头,您可以使用正则表达式(尽管您需要转义文本):

import re

def sort_it(lst, ignore):
  lst.sort(key=lambda x: re.sub("^"+re.escape(ignore),"",x))

或没有正则表达式,也许是最好的解决方案,使用三元表达式和startswith,因为我们不需要正则表达式:

def sort_it(lst, ignore):
  lst.sort(key=lambda x: x[len(ignore):] if x.startswith(ignore) else x)