正在返回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))
如上所述,您的代码可以工作,但没有对函数的返回值执行任何操作
尽管如此,我还是能想到一些改进。第一,方法
ofdict
将使新字母的大小写更清晰,将默认值设置为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中速度更快,但在另一种语言中速度较慢。我的意见是,避免复制是一个好习惯,除非您必须复制(性能问题,按顺序迭代两次,…)。