Python 中的字符数
Character count in Python
任务给出:需要从用户那里得到一个词,然后统计这个词的总字符数并排序显示(计数必须降序,字符必须升序-
IE。,
如果用户给出 "management"
那么输出应该是
**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)
此代码为我提供以下字符串输出 "management"
a 2
m 2
e 2
n 2
g 1
t 1
m & e 未排序。
我的代码有什么问题?
你可以使用简单的 Counter
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
您的代码的问题在于变量 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)
有多种方法可以实现您的目标。您可以尝试其他人解释的解决方案。
如前所述,您可以使用计数器来获取字符的计数,无需创建集合或列表。
对于排序,您最好使用内置的排序函数,该函数接受 key
参数中的函数。详细了解 sorting and lambda functions。
>>> 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)]
您的代码的问题在于,您试图从列表中删除一个元素 ,同时您仍在对其进行迭代。 This can cause problems. 目前,您删除 "a",然后 "e" 占据它的位置 - 列表前进到下一个字母 "m"。因此,"e" 被跳过直到下一次迭代。
尝试将打印和删除分开,不要从当前迭代的列表中删除元素 - 相反,尝试将所有 other 元素添加到新列表.
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)
management
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
),然后用字符的 ascii 值 (ord(x[0])
) 增加它。结果是一个排序顺序,首先考虑计数,其次考虑字符。
一个潜在的假设是 ord(x[0])
永远不会超过 1000,这应该适用于英文字符。
任务给出:需要从用户那里得到一个词,然后统计这个词的总字符数并排序显示(计数必须降序,字符必须升序- IE。, 如果用户给出 "management" 那么输出应该是
**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)
此代码为我提供以下字符串输出 "management"
a 2
m 2
e 2
n 2
g 1
t 1
m & e 未排序。 我的代码有什么问题?
你可以使用简单的 Counter
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
您的代码的问题在于变量 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)
有多种方法可以实现您的目标。您可以尝试其他人解释的解决方案。
如前所述,您可以使用计数器来获取字符的计数,无需创建集合或列表。
对于排序,您最好使用内置的排序函数,该函数接受 key
参数中的函数。详细了解 sorting and lambda functions。
>>> 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)]
您的代码的问题在于,您试图从列表中删除一个元素 ,同时您仍在对其进行迭代。 This can cause problems. 目前,您删除 "a",然后 "e" 占据它的位置 - 列表前进到下一个字母 "m"。因此,"e" 被跳过直到下一次迭代。
尝试将打印和删除分开,不要从当前迭代的列表中删除元素 - 相反,尝试将所有 other 元素添加到新列表.
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)
management
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
),然后用字符的 ascii 值 (ord(x[0])
) 增加它。结果是一个排序顺序,首先考虑计数,其次考虑字符。
一个潜在的假设是 ord(x[0])
永远不会超过 1000,这应该适用于英文字符。