正在返回Python字典

正在返回Python字典,python,Python,我正在尝试创建一个字典,其中包含出现在单词列表中的每个字母的计数。方法count\u letters\u v2(单词列表),打印字母,但不返回字典。为什么?我该如何解决这个问题?多谢各位 def count_letters_v2(word_list): count = {} for word in word_list: print word for letter in word: print letter

我正在尝试创建一个字典,其中包含出现在单词列表中的每个字母的计数。方法
count\u letters\u v2(单词列表)
,打印字母,但不返回字典。为什么?我该如何解决这个问题?多谢各位

def count_letters_v2(word_list):
    count = {}
    for word in word_list:
        print word
        for letter in word:
            print letter
            if letter not in count:
                count[letter] = 1
            else:
                count[letter] = count[letter] + 1
    return count


def main():
    count_letters_v2(['a','short','list','of','words'])


if __name__ == '__main__':
    main()

它确实返回了字典。这就是
返回计数所做的。你想把字典打印出来吗?然后将
main()
更改为

def main():
    print count_letters_v2(['a','short','list','of','words'])

作为记录,标准库中有一个
计数器
对象(dict
的一个子类,可以做所有相同的事情),它将为您完成所有这些

from collections import Counter
def count_letters_v3(word_list):
    return Counter(''.join(word_list))

print count_letters_v3(['a','short','list','of','words'])
输出:

Counter({'a': 1,
         'd': 1,
         'f': 1,
         'h': 1,
         'i': 1,
         'l': 1,
         'o': 3,
         'r': 2,
         's': 3,
         't': 2,
         'w': 1})

它确实返回了字典。这就是
返回计数所做的。你想把字典打印出来吗?然后将
main()
更改为

def main():
    print count_letters_v2(['a','short','list','of','words'])

作为记录,标准库中有一个
计数器
对象(dict
的一个子类,可以做所有相同的事情),它将为您完成所有这些

from collections import Counter
def count_letters_v3(word_list):
    return Counter(''.join(word_list))

print count_letters_v3(['a','short','list','of','words'])
输出:

Counter({'a': 1,
         'd': 1,
         'f': 1,
         'h': 1,
         'i': 1,
         'l': 1,
         'o': 3,
         'r': 2,
         's': 3,
         't': 2,
         'w': 1})

如上所述,您的代码可以工作,但没有对函数的返回值执行任何操作

尽管如此,我还是能想到一些改进。第一,方法 of
dict
将使新字母的大小写更清晰,将默认值设置为
0

...
count = {}
for word in word_list:
    for letter in word:
        count[letter] = count.get(letter, 0) + 1
...
否则,您可以使用集合中的
计数器
对象:

from collections import Counter

def count_letters_v2(word_list):
    count = Counter()
    for word in word_list:
       count.update(word)
    return count
如果单词列表很长,则不应使用
str.join
,因为它会生成新字符串。
itertools
模块的
chain\u from\u iterable
方法将免费链接字母:

from collections import Counter
from itertools import chain

def count_letters_v2(word_list):
    return Counter(chain.from_iterable(word_list))

如上所述,您的代码可以工作,但没有对函数的返回值执行任何操作

尽管如此,我还是能想到一些改进。第一,方法 of
dict
将使新字母的大小写更清晰,将默认值设置为
0

...
count = {}
for word in word_list:
    for letter in word:
        count[letter] = count.get(letter, 0) + 1
...
否则,您可以使用集合中的
计数器
对象:

from collections import Counter

def count_letters_v2(word_list):
    count = Counter()
    for word in word_list:
       count.update(word)
    return count
如果单词列表很长,则不应使用
str.join
,因为它会生成新字符串。
itertools
模块的
chain\u from\u iterable
方法将免费链接字母:

from collections import Counter
from itertools import chain

def count_letters_v2(word_list):
    return Counter(chain.from_iterable(word_list))

它确实返回了字典。这就是
返回计数所做的。确认:您不需要使用
计数字母v2(['a','short','list','of','words'))
。试着把它打印出来!这个函数没有问题。将
count\u letters\u v2
的结果分配给另一个变量,并在shell中检查它。您将看到它包含预期的计数。
print
当您调用函数查看它返回的值时。此外,您可能需要检查
计数器
内置,它确实返回字典。这就是
返回计数所做的。确认:您不需要使用
计数字母v2(['a','short','list','of','words'))
。试着把它打印出来!这个函数没有问题。将
count\u letters\u v2
的结果分配给另一个变量,并在shell中检查它。您将看到它包含预期的计数。
print
当您调用函数以查看它返回的值时。此外,您可能需要检查
计数器
内置,但chain方法(稍微)比join慢:
x=['a','short','list','of','strings']*10_000
%timeit计数器(''.join(x));每个回路12.4 ms±23.7µs(7次运行的平均值±标准偏差,每个100个回路)
%timeit计数器(itertools.chain.from_iterable(x));每个循环14.5 ms±44.9µs(7次运行的平均值±标准偏差,每个循环100次)
@FHTMitchell我做了一些测试来确认您的基准测试。通常的时间-空间权衡(小笑话:在你进行交换之前它会更快…),但我认为在这种情况下不应该复制。在Python中速度更快,但在另一种语言中速度较慢。我的观点是,避免复制是一个好习惯,除非你必须复制(性能问题,按顺序迭代两次,…)。链式方法(稍微)比join慢:
x=['a','short','list','of','strings']*10_000
%timeit计数器(''.join(x));每个回路12.4 ms±23.7µs(7次运行的平均值±标准偏差,每个100个回路)
%timeit计数器(itertools.chain.from_iterable(x));每个循环14.5 ms±44.9µs(7次运行的平均值±标准偏差,每个循环100次)
@FHTMitchell我做了一些测试来确认您的基准测试。通常的时间-空间权衡(小笑话:在你进行交换之前它会更快…),但我认为在这种情况下不应该复制。在Python中速度更快,但在另一种语言中速度较慢。我的意见是,避免复制是一个好习惯,除非您必须复制(性能问题,按顺序迭代两次,…)。