0

私のコードが行うことは、文字が出現した回数を数え、それを尊重された文字まで数えることです。したがって、A が 2 回表示される場合は、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

ファイルの各行の個々の文字をループする必要がありCounter、配列の代わりに a を使用できます。

大文字のみが必要な場合は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ループでファイルのすべての文字を反復処理する2つの代替方法を示したいと思います

iter1 つ目は、callable (1 文字を読み取る) とセンチネル (この値を返すまで関数を呼び出し続ける) を使用する 2 番目の形式を使用することです。この場合functools.partial、1 バイトを読み取る関数を作成するために使用します。

import functools

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

2 番目は、2 次元のリストを平坦化するためによく使用され、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 に答える