【问题标题】:How to sort list based on it's corresponding ascii values?如何根据相应的 ascii 值对列表进行排序?
【发布时间】:2020-08-20 06:41:48
【问题描述】:
list1 = ['a', 'b', 'c', 'd', 'ab', 'bc', 'cd', 'abc', 'bcd', 'abcd']

如何根据对应的ascii 值对该列表值进行排序?

sorted(list1, key=len,reverse=True)
Outputs      : ['abcd', 'abc', 'bcd', 'ab', 'bc', 'cd', 'a', 'b', 'c', 'd']
ascii values : [394, 294, 297, 195, 197, 199, 97, 98, 99, 100]

试过这个,它打印 ascii 值。但可能我需要存储在字典中。然后对其进行排序,然后提取。任何简单且最佳的处理方式(可能使用映射或不使用任何其他列表/字典)。

for i in list1:
    print(i, sum(map(ord, i)))

基于ascii的预期输出(降序):

['abcd', 'bcd','abc','cd','bc','ab', 'd', 'c', 'b','a']
[ 394  ,  297,  294,  199, 197, 195, 100,  99,  98, 97]

【问题讨论】:

  • 你的预期输出是什么?
  • 基于其 ASCII 值 ['abcd', 'bcd','abc','cd','bc','ab','d','c','b', 'a'] 按降序排列。
  • @superbrain 列表根据 ascii 值降序排列。上面发布的输出是基于 key=len(不是 ascii)获得的
  • @superbrain 可能会让您感到困惑。更新了预期的输出,希望现在很清楚。因此被否决?

标签: python-3.x list sorting ascii


【解决方案1】:

您可以只使用您的 ascii 转换函数作为排序键来按这些值排序:

list1 = ['a', 'b', 'c', 'd', 'ab', 'bc', 'cd', 'abc', 'bcd', 'abcd']

print(sorted(list1, key = lambda s: sum(map(ord, s)), reverse=True))

输出

['abcd', 'bcd', 'abc', 'cd', 'bc', 'ab', 'd', 'c', 'b', 'a']

请注意,这将在list1 中留下与原始列表中相同的 ascii 值排序的值(因为 python 排序是稳定的)。您可能希望以与列表其余部分相同的顺序对它们进行排序(例如,'da' 将在'ad' 之前排序),在这种情况下,您只需将当前值添加到键函数中,以便它首先排序通过 ascii 值,然后是实际的字符串:

sorted(list1, key = lambda s: (sum(map(ord, s)), s), reverse=True)

感谢@superbrain 为这些编辑提供输入。

【讨论】:

  • 感谢您补充高效的信息。
  • @StackGuru 不用担心 - 我很高兴它很有用。对压缩列表排序还有一个好处,就是当ascii总数相同时,会按照实际字符串排序,所以(比如)'da'会排在'ad'之前。
  • 通常,通过几个标准(如第二个解决方案的“优势”)进行排序也是使用 key 函数完成的,如lambda s: (sum(map(ord, s)), s)。与 zip 解决方案非常相似,但不需要额外的传递即可从对中取回值。
  • @superbrain (一直想把它读成超级大脑 :) 我对 python 内部结构不够熟悉,不知道这是否真的需要第二遍,看起来应该很容易优化掉。但无论如何你说的都是有道理的,我会删除这部分答案。
  • 这当然是这个名字的全部意义,我认为人们只会输入@-s-tab 并且懒得添加空格:-)。我猜第二遍你的意思是内部的东西并谈论效率?这不是我的意思,我只是指您的列表理解,即您需要更多代码。
【解决方案2】:
list1 = ['a', 'b', 'c', 'd', 'ab', 'bc', 'cd', 'abc', 'bcd', 'abcd']

print(sorted(list1, reverse=True, key=lambda k: sum(ord(ch) for ch in k)))

打印:

['abcd', 'bcd', 'abc', 'cd', 'bc', 'ab', 'd', 'c', 'b', 'a']

【讨论】:

    【解决方案3】:

    这是一个使用相应ascii 值列表的解决方案。

    sorted_list1 = [i for _, i in sorted(zip([sum(map(ord, x)) for x in list1], list1), reverse=True)]
    sorted_list1
    output : ['abcd', 'bcd', 'abc', 'cd', 'bc', 'ab', 'd', 'c', 'b', 'a']
    

    【讨论】:

      【解决方案4】:

      您可以通过函数定义键 由于您的意思是将字符串中所有字符的总和作为 ascii 值,因此您可以定义一种方法来生成 ascii 值并按其排序

      def to_ascii(var):
          if len(var) > 0:
              # sum by char
          else:
              # return ascii
      
      sorted(list1, key=to_ascii, reverse=True)
      

      输出:

      ['abcd', 'bcd', 'abc', 'cd', 'bc', 'ab', 'd', 'c', 'b', 'a']
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-12-29
        • 2014-07-13
        • 1970-01-01
        • 2021-11-25
        • 2015-01-05
        • 2021-05-17
        • 2021-06-29
        相关资源
        最近更新 更多