【问题标题】:Sort list of strings with lambda and ignore prefix使用 lambda 对字符串列表进行排序并忽略前缀
【发布时间】:2018-05-04 06:02:16
【问题描述】:

我正在尝试对列表进行排序,但忽略了前缀。这个问题已经回答了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

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

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

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

【问题讨论】:

  • 从排序更改为已排序。排序功能改变了原地列表; `sorted 只保留原始列表,并返回一个已排序的副本。
  • 你的按键功能不对。 str.strip 不适合删除前缀。使用lambda x: x[4:] if x.startswith('www.') else x
  • @Prune 当然,但这不是这里的根本问题。
  • @SwakeertJain 问题是"www.wagons.com".strip("www.")返回'agons.com'
  • 对不起!我的错。我误解了问题中的最后一句话

标签: python python-2.7 list sorting lambda


【解决方案1】:

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)

【讨论】:

  • 感谢您的全面回答。更新了我在问题中的代码以使用忽略参数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多