0

我的代码所做的是计算一个字母出现的次数并将其计入受尊敬的字母。因此,如果 A 出现两次,它将显示 2:A。我的问题是我希望它从文件中读取,而当 ord() 尝试读取时,它不能。我不知道如何解决这个问题。

t=open('lettersTEst.txt','r')
tList=[0]*26
aL=['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']

idx=0


for char in t:
    ch=ord(char)
    if ch >=65 and ch <= 90:
        pos=int(ch)-65
        tList[pos]+=1

for ele in tList:
    print(idx, ": ", tList[ch])
    idx+=1
4

3 回答 3

3

当您遍历文件时,您会得到行。如果你想要字符,你也需要遍历每一行。

for line in t:
    for char in line:
        ch = ord(char)
        ...
于 2016-05-03T19:12:28.970 回答
3

您需要遍历文件每一行的单个字符,并且可以使用 aCounter而不是数组。

如果您只想要大写字符,if char.isupper()请在添加到计数器之前添加。

例子

>>> from collections import Counter
>>> c = Counter()
>>> with open('lettersTEst.txt') as f:
...     for line in f: 
...         for char in line:
...             c[char] += 1
...
>>> for k,v in c.items():
...     print('{}:{}'.format(k,v))
...
a:2
 :4
e:1
g:1
i:3
h:1
m:1
l:1
n:1
p:1
s:4
r:1
t:2
于 2016-05-03T19:17:16.773 回答
1

虽然我更喜欢@JohnKugelman 的答案而不是我自己的答案,但我想展示两种在单个 for 循环中迭代文件的每个字符的替代方法

第一种是使用第二种形式,iter使用可调用(读取一个字符)和哨兵(继续调用函数,直到它返回此值)在这种情况下,我将使用functools.partial使函数读取一个字节:

import functools

read_a_byte = functools.partial(t.read, 1)
for char in iter(read_a_byte,''):
    ch = ord(char)
    ...

第二个经常用于展平二维列表,itertools.chain.from_iterable获取迭代的内容(文件)并在迭代中将每个生成的值(每一行)链接在一起。

import itertools
char_iterator = itertools.chain.from_iterable(t)
for char in char_iterator:
    ch = ord(char)
    ...

然后你可以传递collections.Counter给构造一个基本计数器,但它不会遵循你应用的相同逻辑ord

read_a_byte = functools.partial(t.read, 1)
c = collections.Counter(iter(read_a_byte,''))

>>> pprint.pprint(dict(c))
{'a': 8,
 'b': 2,
 'c': 9,
 'd': 4,
 'e': 11,
 ...}
于 2016-05-03T19:27:53.997 回答