我正在尝试创建一个函数来计算字符串列表的第一个字母的出现次数并将它们作为字典返回。
例如:
list = [“banana”,“ball”,“cat”,“hat”]
字典看起来像:{b:2,c:1,h:1}
这是我所拥有的代码,它迭代但不正确。那就是我陷入困境的地方。如何更新要计数的值?
def count_starts(text):
new_list=[]
for word in range(len(text)):
for letter in text[word]:
if letter[0]=='':
new_list.append(None)
else:
new_list.append(letter[0])
new_dict= {x:new_list.count(x) for x in new_list}
return new_dict
另外,如果给出以下格式,如何避免超出范围错误:
def count_starts(text):
import collections
c=collections.Counter(x[0] for x in text)
return c
另外,如果列表中包含“None”作为值,我还需要做什么?我需要算无。
答案 0 :(得分:3)
您的代码问题在于您似乎在迭代单词的所有字母。 letter[0]
是字母的子字符串(字符串)。
你必须更简单地做到这一点,不需要双循环,把你单词的每个首字母写下来:
for word in text:
if word: # to filter out empty strings
first_letter = word[0]
但是再次collections.Counter
采用生成器理解来提取第一个字母是最好的选择和单行(添加条件来过滤掉空字符串):
import collections
c = collections.Counter(x[0] for x in ["banana","ball", "cat", "", "hat"] if x)
c
现在是一个词典:Counter({'b': 2, 'h': 1, 'c': 1})
插入None
而不是过滤掉空值的一个变体是:
c = collections.Counter(x[0] if x else None for x in ["banana","ball", "cat", "", "hat"])
答案 1 :(得分:1)
my_list=["banana","ball", "cat", "hat"]
my_dict = dict()
for word in my_list:
try:
my_dict[word[0]] += 1
except KeyError:
my_dict[word[0]] = 1
这会将现有密钥的密钥值增加1,如果在创建密钥之前未找到密钥,则值为1
替代:
my_list=["banana","ball", "bubbles", "cat", "hat"]
my_dict = dict()
for word in my_list:
if word[0] in my_dict.keys():
my_dict[word[0]] += 1
else:
my_dict[word[0]] = 1
答案 2 :(得分:1)
另外,如果列表中包含“None”作为值,我还需要做什么?一世 需要数无。
删除无
lst_no_Nones = [x for x in lis if x != None]
数无
total_None = (sum(x != None for x in lst))
答案 3 :(得分:0)
你需要反击:
from collections import Counter
lst = ["banana","ball", "cat", "hat"]
dct = Counter(lst)
现在,dct存储lst中每个元素出现的次数。
dct = {' b':2,' h':1,' c':1}