Python 使用lambda和dictionary函数

Python 使用lambda和dictionary函数,python,python-2.7,Python,Python 2.7,我写了这个函数: def make_upper(words): for word in words: ind = words.index(word) words[ind] = word.upper() 我还编写了一个计算每个字母出现频率的函数: def letter_cnt(word,freq): for let in word: if let == 'A': freq[0]+=1 elif let ==

我写了这个函数:

def make_upper(words):
    for word in words:
        ind = words.index(word)
        words[ind] = word.upper()   
我还编写了一个计算每个字母出现频率的函数:

 def letter_cnt(word,freq):
    for let in word:
        if let == 'A': freq[0]+=1
        elif let == 'B': freq[1]+=1
        elif let == 'C': freq[2]+=1
        elif let == 'D': freq[3]+=1
        elif let == 'E': freq[4]+=1

如果要使用
lambda
将列表中的字符串转换为大写,可以将其与as一起使用:

根据:

映射(函数、iterable等)

将函数应用于iterable的每个项并返回结果列表


查找word中每个字符的频率,您可以使用(子类
dict
类型)作为:

根据:

计数器是用于计算可散列对象的dict子类。它是一个无序集合,其中元素存储为字典键,其计数存储为字典值


对于字母计数,不要重新发明轮子

计数器是用于计算可散列对象的dict子类。它是一个无序集合,其中元素存储为字典键,其计数存储为字典值。计数允许为任何整数值,包括零或负计数。计数器类类似于其他语言中的bags或Multiset


是的,用字典计算字母频率会更有效率。请注意,您正在手动将每个字母与数字对齐(“a”与0等)。如果我们可以有一个数据类型,将一个字母与它出现的次数直接关联,而不在两者之间添加一组额外的数字,这不是更容易吗

以代码为例:

freq = {"A":0, "B":0, "C":0, "D":0, ... ..., "Z":0}
for letter in text:
     freq[letter] += 1
此字典用于比当前代码更有效地计算频率。每次看到一封信时,只需在一个条目中添加一封即可


我还将提到,您可以使用某些库有效地计算频率。如果您对分析频率感兴趣,请查看collections.Counter()和collections.Counter.most_common()方法

无论您是否决定只使用collections.Counter(),我都会尝试了解为什么字典在这种情况下很有用


最后一个注意事项:我个人发现为“freq”字典键入值很乏味。如果需要,您可以使用以下代码动态构建字母表字母的空字典:

alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
freq = {letter:0 for letter in alphabet}

您可以阅读和的文档,或将其作为一个小演示运行:

from collections import Counter


words = ["acdefg","abcdefg","abcdfg"]
#list comprehension no need for lambda or map
new_words = [word.upper() for word in words] 
print(new_words)

# Lets create a dict and a counter
letters = {}
letters_counter = Counter()

for word in words:
   # The counter count and add the deltas.
   letters_counter += Counter(word)
   # We can do it to 
   for letter in word:
       letters[letter] = letters.get(letter,0) + 1

print(letters_counter)  
print(letters)  
def punc_移除(文字):

定义字母(单词、频率): 对于输入字: 频率[let]+=1

导入字符串 def字母频率(fname): fhand=打开(fname) freqs=dict() alpha=列表(字符串.大写[:26]) 对于let-in alpha:freqs[let]=freqs.get(let,0)


你是什么意思?这就是我所做的:导入字符串alpha=list(string.uppercase[:26])freq\u d=dict()以让alpha:freq\u d[let]=freq\u d.get(let,0)你检查了我发布的链接了吗?在我发布它的时候,我在手机上,所以复制粘贴东西不是很容易,到我可以的时候,@anonymous已经详细说明了。下次我会详细说明
alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
freq = {letter:0 for letter in alphabet}
from collections import Counter


words = ["acdefg","abcdefg","abcdfg"]
#list comprehension no need for lambda or map
new_words = [word.upper() for word in words] 
print(new_words)

# Lets create a dict and a counter
letters = {}
letters_counter = Counter()

for word in words:
   # The counter count and add the deltas.
   letters_counter += Counter(word)
   # We can do it to 
   for letter in word:
       letters[letter] = letters.get(letter,0) + 1

print(letters_counter)  
print(letters)  
for word in words:
    if word.isalnum() == False:
        charl = []
        for char in word: 
            if char.isalnum()==True:
                charl.append(char)
        ind = words.index(word)
        delimeter = ""
        words[ind] = delimeter.join(charl)
for line in fhand:
    line = line.rstrip() 
    words = line.split() 
    punc_remove(words)
    #map(lambda word: word.upper(),words)
    words = [word.upper() for word in words]  
    for word in words:
        letter_cnt_dic(word,freqs)

fhand.close()

return freqs.values()