【问题标题】:Sorting list of strings by a character按字符对字符串列表进行排序
【发布时间】:2021-06-10 21:56:29
【问题描述】:

我得到了以下任务:

为给定的字符串列表编写一个函数,该函数返回一个排序列表,其中所有字符串都以字符 x 开头(定义两个列表)

我卡在这里:

set_words_list = ["argentinax", "football", "ss", "poxland", "axmerica"]
set_words_list.sort(key=str("x"))
print(set_words_list)

然后弹出错误:

Traceback (most recent call last):
  File "/5SortList/main.py", line 7, in <module>
    set_words_list.sort(key=str("x"))
TypeError: 'str' object is not callable

这是我第一次用 Python 编码,我不知道从那里去哪里。 最重要的是,根据任务需要使用 2 个列表,但我不知道它对我有什么帮助。

【问题讨论】:

  • key 必须是在排序时返回要比较的部分元素的函数。
  • 您的列表中没有以“x”开头的字符串。否则你可以使用:set_words_list.sort(key=lambda s:(s[:1]!="x",s))
  • 目前尚不清楚“返回所有字符串以字符 x 开头的排序列表”是什么意思(特别是因为列表中没有单词以 x 开头)。你可以为set_words_list 显示你想要的输出吗?

标签: python string list sorting


【解决方案1】:

最简单的方法是将输入分成两个列表。一个包含以x 开头的元素,另一个包含其余部分。这就是指令中“定义两个列表”的意思。

然后对这些列表中的每一个进行排序并将它们连接起来。

x_words = []
nox_words = []
for word in set_words_list:
    if word.startswith("x"):
        x_words.append(word)
    else:
        nox_words.append(word)

result = sorted(x_words) + sorted(nox_words)

【讨论】:

    【解决方案2】:
    list.sort(reverse=True|False, key=myFunc)
    
    reverse --> Optional. reverse=True will sort the list descending. Default is reverse=False
    key-->  Optional. A function to specify the sorting criteria(s)
    

    在下面的代码中,我们将myFunc 传递给排序函数的关键部分。 函数返回 not e.startswith('x'),因为 True == 1。这将对以 'x' 开头的单词进行排序。

    def myFunc(e):
        return  not e.startswith('x')
    
    set_words_list = ["argentinax", "football", "ss", "poxland", "axmerica", 'xx']
    
    set_words_list.sort(key=myFunc)
    print(set_words_list)
    

    【讨论】:

    • key 没有指定排序标准。它提取应该在元素之间进行比较的输入部分。
    • 好的。你认为我应该用什么来解决这个任务?
    • 您似乎只是在展示sort() 方法的文档,而不是解释如何解决给定问题。
    • @Barmar 实际上我正在处理上面的代码。我不知道为什么它不起作用。你能帮忙吗?
    • 现在您只是按它们是否以x 开头进行排序,而不是按每个组中的其余单词排序。
    【解决方案3】:
    set_words_list = ["argentinax", "football", "ss", "poxland", 'xamerica' ,"axmerica"]
    
    x_first_letter = sorted([x for x in set_words_list if x[0]=='x'])
    nox_first_letter = sorted([x for x in set_words_list if not x[0]=='x'])
    

    【讨论】:

    • 它现在可以工作了 :) 它非常接近 Barmar 的解决方案,但在代码方面要短一些。
    • “按字长排序” 不正确。
    猜你喜欢
    • 2018-07-02
    • 2014-04-15
    • 2012-04-03
    • 1970-01-01
    • 2012-11-26
    • 2014-02-21
    • 2018-07-07
    • 1970-01-01
    • 2015-03-26
    相关资源
    最近更新 更多