输入是一个字符串,其思路是仅对字母A-z进行计数,并按字母顺序打印出现的计数。
像往常一样,我一直坚持这个'直到我得到一个工作结果,但现在寻求优化它,以便更好地理解Python的做事方式。
def string_lower_as_list(string):
"""
>>> string_lower_as_list('a bC')
['a', ' ', 'b', 'c']
"""
return list(string.lower())
from sys import argv
letters = [letter for letter in string_lower_as_list(argv[1])
if ord(letter) < 124 and ord(letter) > 96]
uniques = sorted(set(letters))
for let in uniques:
print let, letters.count(let)
修改 应该说,win2上的Python 2.7
答案 0 :(得分:2)
您可以直接比较字母,实际上只需要比较小写字母
letters = [letter for letter in string_lower_as_list(argv[1])
if "a" <= letter <= "z"]
但更好的方法是使用字典来计算值。每次调用它时,letters.count
都必须遍历列表。但是你已经遍历了列表以过滤掉正确的字符,那么为什么不同时计算它们呢?
letters = {}
for letter in string_lower_as_list(argv[1]):
if "a" <= letter <= "z":
letters[letter] = letters.get(letter, 0) + 1
for letter in sorted(letters):
print letter, letters[letter]
编辑:正如其他人所说,您不必将字符串转换为列表。您可以直接迭代它:for letter in argv[1].lower()
。
答案 1 :(得分:2)
如何删除列表推导中的ord(字母)重复?
你可以使用一种特定于Python的,有些神奇的习惯用法,但这种习惯用法在其他语言中不起作用:if 96 < ord(letter) < 124
。
在这种情况下使用Dictionary或Tuple会有什么好处,如果有,怎么办?
您可以尝试使用Python 2.7中添加的collections.Counter
类。
P.S。您不需要将字符串转换为列表,以便在列表推导中迭代它。任何迭代都可以工作,字符串是可迭代的。
P.S。 2.要获取属性'此字母是字母',而不是小写和比较范围,只需使用str.isalpha
。 Unicode对象提供相同的方法,允许相同的代码只使用外语中的文本,而不必知道哪些字符是“字母”。 :)
答案 2 :(得分:1)
您不必将字符串转换为列表,字符串是可迭代的:
letters = {}
for letter in argv[1].lower():
if "a" <= letter <= "z":
letters[letter] = letters.get(letter, 0) + 1
for letter in sorted(letters.keys()):
print letter, letters[letter]