如何根据相应的 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']
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']