Python 列表理解中的Rm重复

Python 列表理解中的Rm重复,python,list-comprehension,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

输入是一个字符串,其思想是只对字母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)
def string\u lower\u as\u列表(字符串):
"""
>>>字符串\u lower\u as\u list('a bC')
[a',''b','c']
"""
返回列表(string.lower())
从系统导入argv
letters=[字符串中字母对应的字母\u lower\u as\u列表(argv[1])
如果作战需求文件(字母)<124且作战需求文件(字母)>96]
uniques=已排序(集合(字母))
对于出租单:
打印let,字母。计数(let)
  • 如何删除列表中的ord(字母)副本
  • 在这种情况下使用字典或元组会有什么好处吗?如果有,怎么做
  • 编辑
    应该说,win32上的Python 2.7可以直接比较字母,实际上只需要比较小写字母

    letters = [letter for letter in string_lower_as_list(argv[1]) 
                if "a" <= letter <= "z"]
    

    编辑:正如其他人所说,您不必将字符串转换为列表。您可以直接遍历它:
    用于argv[1]中的字母。lower()

    您可以直接比较字母,实际上只需要比较小写字母

    letters = [letter for letter in string_lower_as_list(argv[1]) 
                if "a" <= letter <= "z"]
    
    编辑:正如其他人所说,您不必将字符串转换为列表。您可以直接对其进行迭代:
    用于argv[1]中的字母。lower()

    如何删除列表中的ord(字母)副本

    您可以使用一个非常特定于Python且有点神奇的习语,这种习语在其他语言中不起作用:
    if 96

    在这种情况下使用字典或元组会有什么好处吗?如果有,怎么做

    您可以尝试使用Python 2.7中添加的
    collections.Counter

    另外,您不需要将字符串转换为列表,以便在列表中对其进行迭代。任何iterable都可以工作,字符串也是iterable

    第2页。要获取属性“this letter is alphatic”,而不是小写并与范围进行比较,只需使用
    str.isalpha
    。Unicode对象提供相同的方法,允许相同的代码只处理外语文本,而不必知道哪些字符是“字母”。)

    如何删除列表中的ord(字母)副本

    您可以使用一个非常特定于Python且有点神奇的习语,这种习语在其他语言中不起作用:
    if 96

    在这种情况下使用字典或元组会有什么好处吗?如果有,怎么做

    您可以尝试使用Python 2.7中添加的
    collections.Counter

    另外,您不需要将字符串转换为列表,以便在列表中对其进行迭代。任何iterable都可以工作,字符串也是iterable


    第2页。要获取属性“this letter is alphatic”,而不是小写并与范围进行比较,只需使用
    str.isalpha
    。Unicode对象提供相同的方法,允许相同的代码只处理外语文本,而不必知道哪些字符是“字母”。)

    您不必将字符串转换为列表,字符串是可编辑的:

    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]
    
    letters={}
    对于argv[1]中的字母。下()
    
    如果“a”不必将字符串转换为列表,则字符串是可编辑的:

    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]
    
    letters={}
    对于argv[1]中的字母。下()
    
    如果“a”是的,谁需要
    ord
    总之:)顺便说一句,OP代码中的范围实际上是“a”到“{”包括在内。啊,所以..我没有意识到我可以做“a”@Cups:老实说,我也发现
    范围('a','z')让人困惑
    不起作用…@Felix很容易定义检查值是否在“a”和“z”之间意味着什么,这并不意味着很容易定义介于“a”和“z”之间的一组值:)要少一点禅:Python并没有增加值的特殊概念;
    x+1
    正在添加整数er
    1
    到任何
    x
    是什么,而
    'a'+1
    是一个类型错误,因此从概念上讲,我们不能重用使整数范围工作的逻辑来创建字符串范围。当然,
    range
    在C中进行了优化,它们可能有特殊的大小写,但接下来你会遇到一些问题,比如在<代码>范围('x','aa')
    …是的,谁需要
    ord
    无论如何:)顺便说一句,OP代码中的范围实际上是'a'到'{'包括在内。啊,所以..我没有意识到我可以做'a'@Cups:老实说,我还发现
    范围('a','z')令人困惑
    不起作用…@Felix很容易定义检查值是否在“a”和“z”之间意味着什么,这并不意味着很容易定义介于“a”和“z”之间的一组值:)要少一点禅:Python并没有增加值的特殊概念;
    x+1
    正在添加整数er
    1
    到任何
    x
    是什么,而
    'a'+1
    是一个类型错误,因此从概念上讲,我们不能重用使整数范围工作的逻辑来创建字符串范围。当然,
    range
    在C中进行了优化,它们可能有特殊的大小写,但接下来你会遇到一些问题,比如在
    range('x','aa')
    …collections.Counter-crikey看起来很强大-必须从2.6升级live server才能利用,特别是在NLP类型的工作中。collections.Counter-crikey看起来很强大-必须从2.6升级live server才能利用,特别是在NLP类型的工作中。