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

How to sort list based on it's corresponding ascii values?

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 值。但可能我需要存储在字典中。然后对其进行排序然后提取。任何简单和最佳的处理方式(可以使用映射或不使用任何其他 lists/dicts)。

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]
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']

您可以只使用您的 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 对这些编辑的投入。

这是一个使用相应 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']

您可以通过函数定义键 因为你的意思是字符串中所有字符的总和作为 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']