统计英文文本的字符频率,对同一文本,两种代码的结果不同,为何?(语言-python)

第一种是只检索26个字母,第二种是排除特殊符号,但是输出结果显示相同字母的频率不同,是哪里造成的差别?
第三种代码的结果和第一种是一样的,所以第二种代码哪里出现问题了呢?

#第一种代码
alpha = open('hamlet.txt','r').read()
alpha.lower()
lst = []
for i in alpha:
    if i in 'abcdefghijklmnopqrstuvwxyz':   #主要差别在这
        lst.append(i)
dic = {}
for i in lst:
    dic[i] = dic.get(i,0) + 1
diclst = list(dic.items())
diclst.sort(key = lambda x:x[1],reverse = True)
for i in range(26):
    print(diclst[i])
#前五个结果
('e', 14429)
('t', 10944)
('o', 10395)
('a', 8720)
('s', 7900)

#第二种代码
ch = (open('hamlet.txt','r').read()).lower() 
excludes = '|#$%&()*+,-./:;<=>?@[\\]^_{|}!!\'\""\n"……():;’‘“”《》?,。'
dic2={}
for i in ch:
    if i not in excludes and i != ' ':    #这
        dic2[i] = dic2.get(i,0) + 1
diclst2 = list(dic2.items())
diclst2.sort(key = lambda x:x[1],reverse = True)
for i in range(26):
    print(diclst2[i])
#前五个结果
('e', 15859)
('t', 12455)
('o', 11453)
('a', 10257)
('i', 8907)

#第三种代码(部分)
for i in txt:
    if i == " " or i in ex:
        continue
    else:
        if ord(i)<97:         
            i=chr(ord(i)+32)  #大写字母转小写字母 或改为 txt.lower()
        counts[i]=counts.get(i,0)+1

很遗憾,第一和第三都是错的。。。因为 alpha.lower()返回一个新的字符串,但是没有变量接收,所以alpha本身没有改变,还是存在大写字母。