我试图对列表进行排序但忽略前缀。这个问题已经回答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
答案 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)