2017-11-09 15 views
0

次のコードでは、小文字のアルファベットの数を格納して、cnt[char][i + 1]に文字 '文字'の数を文字列のi番目の文字まで与えるようにしています。辞書が更新されていないリスト

import string 
s = 'abcdabcd' 
n = len(s) 
cnt = dict(zip(string.ascii_lowercase, [[0] * (n + 1)] * 26)) 
print('Before') 
print(cnt) 
for i in range(n): 
    for char in string.ascii_lowercase: 
     cnt[char][i + 1] = cnt[char][i] + (1 if char == s[i] else 0) 
print('After') 
print(cnt) 

しかし、出力は、彼らが最初にゼロで満たされているとしてリストが変更取得されていない、とさえループの後、彼らは変更されませんことを示しています。

なぜそれが起こっているのか、またどのように出力するのかを理解できません。

+1

'[[0] *(N + 1)] * 26' **同じリストに26個の参照を行います。 –

+0

@WillemVanOnsemありがとう、今私は問題を理解しています。しかし、どのようにすべてのキーが同じリストを参照しないように上記の辞書を初期化する必要があります。 – tonystark

答えて

0

の新しいリストを使用して辞書を作成します。

import string 
s = 'abcdabcd' 
n = len(s) 
cnt = dict(zip(string.ascii_lowercase, [[0 for _ in range(n + 1)] for __ in range(26)])) 
print('Before') 
print(cnt) 
for i in range(n): 
    for char in string.ascii_lowercase: 
     cnt[char][i + 1] = cnt[char][i] + (1 if char == s[i] else 0) 
print('After') 
print(cnt) 
関連する問題