【问题标题】:Print frequency of words, in a sentence, in a single line打印单词的频率,在一个句子中,在一行中
【发布时间】:2014-01-18 08:32:30
【问题描述】:

我有一句话“快狐跳过懒狗”,我统计了这句话中每个单词出现的次数。输出应该是这样的:

brown:1,dog:1,fox:1,jumps:1,lazy:1,over:1,quick:1,the:2

此输出中的字符之间不应有空格,单词/数字之间应有逗号。 我的程序的输出如下所示:

,brown:1,dog:1,fox:1,jumps:1,lazy:1,over:1,quick:1,the:2

我发现'brown'之前有一个逗号。有没有更简单的方法来打印这个?

    filename = os.path.basename(path)


    with open(filename, 'r+') as f:
        fline = f.read()     
        fwords = fline.split()  

        allwords = [word.lower() for word in fwords]
        sortwords = list(set(allwords))


    r = sorted(sortwords, key=str.lower)

    finalwords = ','.join(r)

    sys.stdout.write(str(finalwords))
    print '\n'

    countlist = {}
    for word in allwords:
        try: countlist[word] += 1
        except KeyError: countlist[word] = 1       

    for c,num in sorted(countlist.items()):
        sys.stdout.write(",{:}:{:}".format(c, num))

【问题讨论】:

    标签: python


    【解决方案1】:

    制作单词列表的几种替代方法。首先,单线:

    countlist = {word:allwords.count(word) for word in allwords}
    

    正如 DSM 所指出的,如果列表很长,该方法可能会很慢。另一种方法是使用defaultdict:

    from itertools import defaultdict
    countlist = defaultdict(int)
    for word in allwords:
        countlist[word] += 1
    

    对于输出,将单个字数与, 连接起来,这样可以避免在开头使用一个:

    sys.stdout.write(",".join(["{:}:{:}".format(key, value) for key, value in countlist .items()]))
    

    【讨论】:

    • OP 已经有了一个字数字典——countlist,这无疑是令人困惑的名称。并且 OP 的计数方法是线性的,所以对于很多单词它会比.count 快。
    • @DSM,我知道 OP 有一个字数字典。这是一种替代的,可能更容易(但在很长的列表中当然更慢)的制作方法。我想我也会添加一个使用defaultdict 的示例。
    猜你喜欢
    • 1970-01-01
    • 2014-03-13
    • 1970-01-01
    • 2015-10-27
    • 2021-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多