0

给定任务:需要从用户那里得到一个词,然后必须统计该词中的总字符并按排序顺序显示(计数必须降序,字符必须升序 - 即,如果用户给出“管理”,那么输出应该是

**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 未排序。我的代码有什么问题?

4

6 回答 6

2

您的代码的问题在于您试图从列表中删除一个元素,而您仍在对其进行迭代。 这可能会导致问题。目前,您删除了“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

演示

于 2019-12-12T04:31:17.013 回答
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)]
于 2019-12-12T04:30:27.260 回答
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
于 2019-12-12T04:12:00.220 回答
1

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

from collections import Counter

Counter("management")
Counter({'a': 2, 'e': 2, 'm': 2, 'n': 2, 'g': 1, 't': 1})
于 2019-12-12T04:05:36.267 回答
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)

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

于 2019-12-12T04:19:37.313 回答
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()首先放置具有较低键的项目(即具有较小值的键),因此我必须使大计数具有较小的值。

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

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

于 2019-12-12T04:32:02.173 回答