在Python中,按值的降序和键的升序对字典进行排序

在Python中,按值的降序和键的升序对字典进行排序,python,Python,我的任务是提取字符串中的所有唯一字符(不包括空格),并根据给定字符在字符串中的出现量对其进行排序(因此按降序排序),如果是连字号,则按其ASCII码进行排序 例如: 输入:“我是一只猫” 输出:“aIcmt” 我特别面临的问题是,如果我使用这行代码进行排序: char\u list=sorted(char\u dict.items(),key=lambda x:(x[1],ord(x[0])),reverse=True) 它甚至对字典中的ord(x[0])部分进行反向排序,虽然我只想对字符出现的

我的任务是提取字符串中的所有唯一字符(不包括空格),并根据给定字符在字符串中的出现量对其进行排序(因此按降序排序),如果是连字号,则按其ASCII码进行排序

例如:

输入:“我是一只猫”

输出:“aIcmt”

我特别面临的问题是,如果我使用这行代码进行排序:

char\u list=sorted(char\u dict.items(),key=lambda x:(x[1],ord(x[0])),reverse=True)

它甚至对字典中的
ord(x[0])
部分进行反向排序,虽然我只想对字符出现的值进行排序

以下是我的代码供参考:

string_list = [char for char in string]
string_list = [char for char in string_list if char != ' ']

print(string_list)

char_dict = {}

for char in string_list:
    if char not in char_dict:
        char_dict[char] = 0
    else:
        char_dict[char] += 1

char_list = sorted(char_dict.items(), key = lambda x: (x[1],ord(x[0])), reverse = True)
print(char_list)

for i in char_list:
    print(i[0], end = '')


获取一个iterable(字符串是iterable的,在迭代时每次返回一个字符),并返回一个类似字典的对象,您可以使用
most\u common

from collections import Counter
counter = Counter(string)
print(''.join(x[0] for x in counter.most_common()))
编辑:

正如疯狂的物理学家所说,要将空间排除在计数之外,你们可以将一个生成器传递给计数器

counter = Counter(c for c in string if c != ' ')

你可以不使用字典就完成这项任务吗?如果是,您可以尝试以下方法:对每个字母使用计数器,让他们检查字符串中没有空格的字符,向匹配的字母添加一个计数器(使用开关),然后用“”组成一个字符串,让他们添加计数器数超过0的字母(您可以对计数器的int值进行排序,以便按顺序进行排序,也可以在添加字母的位置之前进行检查,排序可能更容易),然后您将得到您想要的。

您可以尝试组合使用
计数器
排序
,以及
加入

from collections import Counter

input_str = 'I am a cat'

# use counter to get count of each character including white space
t = list(Counter(input_str).most_common())

# sort on count on reverse and ascii on ascending when ties 
t = sorted(t, key=lambda i: (-i[1], i[0])) 

# exclude white space and join remaining sorted characters
res = ''.join(i[0] for i in t if i[0] != ' ') 

print(res)
输出:

aIcmt

计数器(如果c!='',则c代表字符串中的c)
这是如何处理计数的关系的?从OP开始,
如果是关系,则按其ASCII码对其进行排序
@student,因为
计数器
是Python 3.6以后的
dict
的子类,它将返回字符串中首先出现的字符,然后是出现相同数目的任何其他字符time@student你是科瑞我还没有完全回答你为什么不使用字典这个问题?没有理由不使用,但是如果你没有理由使用,这是一种不用它的方法。你得到了它,我只是用你的
(-x[1],x[0])替换了我的
(x[1],ord(x[0]),reverse=True
。我不知道我可以用负号反向排序。谢谢。