2017-12-05 5 views
1

にリストに項目を追加します。は、私が意図したとおりに動作するプログラムを持っている辞書

import os 
import hashlib 
from pprint import pprint 


def md5(fname): 
    hash_md5 = hashlib.md5() 
    with open(fname, "rb") as f: 
     for chunk in iter(lambda: f.read(4096), b""): 
      hash_md5.update(chunk) 
    return hash_md5.hexdigest() 


lst = [] 
for dirpath, dirnames, filenames in os.walk('d:\\python\\exercism.io'): 
    d = {dirpath: filenames} 
    for filename in filenames: 
     d[filename] = [os.stat(dirpath).st_mtime, md5(dirpath + '\\' + filename)] 
     # d[filename] = [os.stat(dirpath).st_mtime] 
     # d[filename] = [md5(dirpath + '\\' + filename)] 
    lst.append(d) 

pprint(lst) 

私の質問はこれです:私は、この行を取り除く場合

 d[filename] = [os.stat(dirpath).st_mtime, md5(dirpath + '\\' + filename)] 

と2つのコメントアウトされた行を使用しようとすると(修正 - 下記参照)、失敗します。

1)コメントアウトされた行は単独で動作します。値がリストであるkey:valueのペアが得られます。

次に、2番目にコメントアウトされた行の値をリストに追加します。

 d[filename][1] = md5(dirpath + '\\' + filename) 

を私は範囲エラー外のインデックスを取得:

私はこれをしようとしていました。リスト の最初の要素は項目[0]で、2番目の項目は[1]でなければなりません。

部分出力:

[{'ceasar_cipher.py': [1512494094.5630972, '844e069c90ebdb3e1e5f5dd56da2ac2e'], 
    'd:\\python\\exercism.io': ['ceasar_cipher.py', 
           'difference_of_squares.py', 
           'gigasecond.py', 
           'grains_in_python.py', 
           'hamming-compare.py', 
           'isogram.py', 
           'leap_year.py', 
           'rna_transcription.py', 
           'run_length_encoding.py'], 

注キー: 'ceasar_cipher.pyは' 2つの要素リストである値を持っています。

2つのコメントアウトされた行と同じ出力を構築したいのですが、私が今使っている1行に対して、 を使っています。私の心配は単に私が間違っていることです。

答えて

0

あなたはあなたのリストに追加する必要があります。

d[filename] = [os.stat(dirpath).st_mtime] 
d[filename].append(md5(dirpath + '\\' + filename)) 

同じ効果を得るために。インデックス1にはまだアイテムがありません。たとえば、append()を使用して作成する必要があります。

+0

にアクセスしたり、アクセスしたりしなかった場合... – MarkS

関連する問題