2016-06-17 16 views
-3

次のコード例では、idの辞書にその値の2つの数値を持つ辞書resultを作成しています。タプルを値として辞書の値をあらかじめ計算する

# populate the ids list (contents of the current directory which is for a speicif id name) 
ids_list = [filename for filename in glob('*' + .txt) 

def some_numerical_calc(filename): 
    # calculates and returns some number as string 
def size_of_file(filename): 
    # calculates and returns size number as string 

def count_stuff(id, filename): 
    result = { id: (some_numerical_calc(filename), size_of_file(filename)) } 

for id in ids_list: 
    for f in files_list: 
     count_stuff(id, f) 

アイデアは私が最終的に1つの辞書(おそらくこの部品は再設計必要。)の下で、これらすべての辞書のキーと値のペアを集約することです。

私が扱っている問題は、特定のidfiles_listが1より大きい場合です。これらのケースでは、それぞれfilenameのタプル内の2つの数値に、それと同じ数値の前の数値を加算したいとします。filenameとして

ids_list = ['001', '002', '003']id='001'ことが files_list=['file1.txt', 'file2.txt', 'file3.txt']

とを有する

some_numerical_calc('file1.txt')10と を与える場合がその後、

some_numerical_calc('file2.txt')は、150size_of_file('file2.txt')35を与える与え

some_numerical_calc('file3.txt')30size_of_file('file3.txt')120を与える与え、

80を与え、私はid='001'の出力はresult = { '001': (190, 235) }

ことを期待します

私はtuplesが不変であることを知っています。私は各IDのすべてのファイルの2つの数値を事前に計算して、その特定の辞書項目を作成する実装を考え出すのに苦労しています。あるいは、おそらく、私はnamedtuplesを使用し、set(?)に2つの数値を格納することを望んでいたとしても、タプル構造を削除する必要があります。どんな提案も高く評価されます。

効率的で非平凡な提案のために願っています。

+1

あなたがそれを使用している間、値を変更し、リストを使用するには、設定が完了しているnamedtupleにすべての値をキャスト。代わりに 'file_listのfに対してsome_numerical_calc(f)を使用し、file_listのfについてはsize_of_file(f)'を使用して、それをタプルの2つの値として使用することもできます。 –

答えて

2

問題の一部は、コードをひどく整理したことです。あまりにも早くあなたの辞書を作成しています。

def count_stuff(id, filename): 
    return (some_numerical_calc(filename), size_of_file(filename)) 

for id in ids_list: 
    nums = 0 
    sizes = 0 
    for f in files_list: 
     num, size = count_stuff(id, f) 
     nums += num 
     sizes += sizes 
    result = { id: (nums, sizes) } 

、あなたのデータを集計した後今、あなたの辞書が作成されます。

は、あなたがそれをこのような何かを再編成した場合に考えてみましょう。合計が含まれているタプルを作成するには

1

、あなたは*このような何かを行うことができます。あなたの現在のコードを使用して、

result[id] = (sum(some_numerical_calc(filename) for filename in files_list), 
       sum(size_of_file(filename) for filename in files_list)) 

しかし、単にヘッドアップなどを、これがための辞書で同じタプル値を格納しますあなたのidキーのすべて特定のfiles_listと特定のidとを関連付ける方法は現在ありません。

* files_listを2回でなく1回だけ繰り返したい場合は、Python element-wise tuple operations like sumから回答の1つを適応させることができます。

1

あなたがマップとの和を混合試みることができる:

resultDict = {} 

for id in ids_list: 
    resultDict[id] = (sum(map(some_numerical_calc(files_list[id]))), sum(map(size_of_file(files_list[id])))) 

編集:あなたの特定の状況与え

より詳細な例。いくつかの部分は、角括弧内のコメントに記述されます。

#<Get list of ids as strings> 
files_list = {} #Initialize the files dictionary. 

for id in ids_list: 
    #<Switch to directory based on id> 
    files_list[id] = [filename for filename in glob('*' + .txt)] 

def some_numerical_calc(filename): 
    # calculates and returns some number as string 
def size_of_file(filename): 
    # calculates and returns size number as string 

result_dict = {} #Init results. 

for id in ids_list: 
    resultDict[id] = (sum(map(some_numerical_calc(files_list[id]))), sum(map(size_of_file(files_list[id])))) 
+0

私はアイデアとして魅力的なあなたの答えを理解しようとしています。私は 'files_list [id]'部分を取得しません。無関係な辞書のキーとなるインデックスが提供されたときに、リストが返すものは何ですか?おそらく、実際の例を追加できたら? – Karim

+0

あなたの説明は、files_listが2次元データセットであることを示していたようです。つまり、各IDにはそれぞれ独自のファイルセットがあります。したがって、ファイルリストは次のようになります: 'files_list = {'001':['file1.txt'、 'file2.txt'、 'file3.txt']、 '002':['file4.txt'、 'file5 .txt ']、' 003 ':[' file6.txt ']} '。したがって、 'files_list [id]'は与えられたidに関連するファイルのリストを生成します。 –

+0

私がもっと明確にしなければ謝罪します。 'files_list'は特定の' id'のファイル名のリストではありません。すべての 'id'には独自の' files_list'があります。フォルダの内容と同じです。このエレガントな 'sum'と' map'コンボを今実装できると思いますか? – Karim

1

あなたのコードについての奇妙ないくつかのものがありますが、1のために、あなたは新しい辞書にあなたがcount_stuffを呼び出すたびに作成しているが、それを使って何をやったことがないか、それを返します。あなたはすべてが1つの辞書に追加されたように思える質問から。

このような何かがよりよく働くかもしれない:

def some_numerical_calc(filename): 
    # calculates and returns some number as string 
def size_of_file(filename): 
    # calculates and returns size number as string 

def count_stuff(id, file_list): 
    some_number = 0 
    size = 0 
    for filename in file_list: 
     some_number += some_numerical_calc(filename) 
     size += size_of_file(filename) 
    return (some_number, size) 

results = {} 
for id in ids_list: 
    results[id] = count_stuff(id, file_list)) 
print results 
+0

あなたは正しいです。それを明確にすることができませんでした。すべての辞書を辞書の下に置いて、キーとして「id」を、値として数値を保持するつもりです。 (これに言及する修正された質問) – Karim

関連する問題