Rm重复列表理解

时间:2011-07-09 13:22:53

标签: python list-comprehension

输入是一个字符串,其思路是仅对字母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)
  1. 如何删除列表推导中的ord(字母)重复?
  2. 在这种情况下使用词典或元组会有什么好处,如果有,怎么样?
  3. 修改 应该说,win2上的Python 2.7

3 个答案:

答案 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]