Python 中的字符计数



任务给出:需要从用户那里获取一个单词,那么单词中的字符总数必须按排序顺序计算和显示(计数必须降序,字符必须升序 - 即, 如果用户作为"管理"给出 那么输出应该是

**a 2
e 2
m 2
n 2
g 1
t 1**

这是我为任务编写的代码:

string=input().strip()
set1=set(string)
lis=[]
for i in set1:
lis.append(i)
lis.sort()
while len(lis)>0:
maxi=0
for i in lis:
if string.count(i)>maxi:
maxi=string.count(i)
for j in lis:
if string.count(j)==maxi:
print(j,maxi)
lis.remove(j)

这段代码给了我以下字符串"管理"的输出

a 2
m 2
e 2
n 2
g 1
t 1

M和E未排序。 我的代码有什么问题?

代码的问题在于,您尝试从列表中删除某个元素,同时仍在迭代该元素。这可能会导致问题。目前,您删除了"a",因此"e"占据了它的位置 - 列表前进到下一个字母"m"。因此,"e"被跳过,直到下一次迭代。

尝试将打印和删除分开,不要从当前正在迭代的列表中删除元素 - 而是尝试将所有其他元素添加到新列表中。

string=input().strip()
set1=set(string)
lis=[]
for i in set1:
lis.append(i)
lis.sort()
while len(lis)>0:
maxi=0
for i in lis:
if string.count(i)>maxi:
maxi=string.count(i)
for j in lis:
if string.count(j)==maxi:
print(j,maxi)

dupelis = lis
lis = [] 
for k in dupelis:
if string.count(k)!=maxi:
lis.append(k)

管理
A 2 E 2 m 2 n 2



g 1 t 1

演示

代码的问题在于变量maxi和两个for循环的分配。"e"不会排在第二位,因为您将maxi分配为"2",并且string.count(i(将小于maxi。

for i in lis:
if string.count(i)>maxi:
maxi=string.count(i)
for j in lis:
if string.count(j)==maxi:
print(j,maxi)

有几种方法可以实现您正在寻找的目标。您可以尝试其他人解释的解决方案。

您可以使用一个简单的计数器

from collections import Counter
Counter("management")
Counter({'a': 2, 'e': 2, 'm': 2, 'n': 2, 'g': 1, 't': 1})

我不太确定通过添加一个while循环然后在其中添加两个嵌套的for循环来实现什么。但是同样的事情也可以通过单个 for 循环来实现。

for i in lis:
print(i, string.count(i))

这样,输出将是:

a 2
e 2
g 1
m 2
n 2
t 1

如前所述,您可以使用计数器来获取字符数,而无需进行设置或列表。

对于排序,最好使用内置的排序函数,该函数接受key参数中的函数。阅读有关排序和 lambda 函数的更多信息。

>>> from collections import Counter
>>> c = Counter('management')
>>> sorted(c.items())
[('a', 2), ('e', 2), ('g', 1), ('m', 2), ('n', 2), ('t', 1)]
>>> alpha_sorted = sorted(c.items())
>>> sorted(alpha_sorted, key=lambda x: x[1])
[('g', 1), ('t', 1), ('a', 2), ('e', 2), ('m', 2), ('n', 2)]
>>> sorted(alpha_sorted, key=lambda x: x[1], reverse=True) # Reverse ensures you get descending sort
[('a', 2), ('e', 2), ('m', 2), ('n', 2), ('g', 1), ('t', 1)]

计算字符的最简单方法是使用Counter,正如之前的一些答案所建议的那样。之后,诀窍是想出一种同时考虑计数和字符的措施以实现排序。我有以下几点:

from collections import Counter
c = Counter('management')
sc = sorted(c.items(),
key=lambda x: -1000 * x[1] + ord(x[0]))
for char, count in sc:
print(char, count)

c.items()给出了元组(character, count)的列表。我们可以使用sorted()对它们进行排序。

参数key是键。sorted()把键较低的项目(即值较小的键(放在第一位,所以我必须使大计数具有较小的值。

我基本上给计数(x[1](很多负权重(-1000(,然后用字符(ord(x[0])(的ascii值来增加它。结果是一个排序顺序,首先考虑计数,其次考虑字符。

一个基本的假设是ord(x[0])永远不会超过 1000,这应该适用于英语字符。

相关内容

  • 没有找到相关文章

最新更新