3

パイソン初心者です。辞書について質問です。

私の入力は、インポートされた CSV ファイルで使用される検索語のリストとして機能する可変長リスト (例: a = ['eggs', 'ham', 'bacon'...] ) です。

上記の CSV ファイルのさまざまな値に各用語を一致させる 4 つの関数を定義しました。したがって、各入力用語は、結果の 4 つのリストになります。

入力用語をキーとして辞書に保存し (簡単です)、結果の 4 つのリストを値として保存したいと思います (これも簡単です)。

ただし、入力リストは可変長であるため、辞書「term1」、「term2」を定義して名前を付ける関数を設定したいと思います。これは非常に基本的に次のように示されています。

term1 = { 'eggs' : [[list1] , [list2] , [list3] , [list4]] }
term2 = { 'ham' : [[list1] , [list2] , [list3] , [list4]] }
term3 = { 'bacon' : [[list1] , [list2] , [list3] , [list4]] }

a) このような辞書に名前を付ける方法はありますか?; b) そして、それらはグローバルに利用可能ですか? もしそうなら、どのように?ありとあらゆる助けが非常に高く評価されています。

4

3 に答える 3

3

お勧めする方法ではありませんが、ローカルとグローバルの両方の名前空間に辞書としてアクセスできます。たとえば、おなじみの dict インターフェイスを使用して、これらの名前空間に任意の変数を追加できます。

>>> globals()['foo'] = 'bar'
>>> foo
'bar'
>>> locals()['spam'] = 'eggs'
>>> spam
'eggs'

ただし、名前の競合が発生します。また、コードの残りの部分は、どのグローバル変数に結果が含まれているかをどのように知るのでしょうか? 間接的なルックアップも行う必要があります。

結果を含む辞書を1 つだけ使用し、それをグローバル名前空間ではなく名前空間にすることをお勧めします。

于 2011-05-26T11:46:10.023 に答える
2

次のようなものを試すことができます:

results = {}
for name in ['eggs', 'ham', 'bacon']:
   results[name] = (function1(name), function2(name), function3(name), function4(name),)

functionX は、CSV ファイルなどから listX の結果を返す関数です。

ここでは、結果辞書に次のようなものがあります。

results = { 
   'eggs' : (egg_list1, egg_list2, egg_list3, egg_list4), 
   'ham' : (ham_list1, ham_list2, ham_list3, ham_list4),
   'bacon' : (bacon_list1, bacon_list2, bacon_list3, bacon_list4),
}
于 2011-05-26T11:51:50.557 に答える
2

すべてのデータを含む 1 つの辞書を事前に初期化する方法を次に示します。

a = "eggs bacon ham".split()
summary = dict((key,([],[],[],[])) for key in a)

for lineno,line in enumerate(csv_file):
    # first element in the line is assumed to be the key ("eggs", "bacon", etc.)
    key = line[0]
    # update the data values for this key
    summary[key][0].append(lineno)
    summary[key][1].append(something_else)
    # ... etc.

ただし、この種のインデックス付きアクセスは少し脆弱であり、キー付きアクセスまたは属性アクセスを好みます。ハードコーディングされた 4 つのリストのリストは、dict またはいくつかの単純なデータ集計クラスのオブジェクトとしてより適切に表現される場合があります。

また、CSV ファイルに「パンケーキ」、「ワッフル」、「ハッシュブラウン」などのエントリがあるため、「卵」、「ベーコン」、「ハム」のリストは時間の経過とともに増えると思います。最近、データ ファイルやデータベース テーブルを調べながら、データを集計するために defaultdict を使用することが多くなりました。取得するキーを事前に定義する (入力データに新しい値が追加されたときにリストを自分で更新する必要がある) 代わりに、defaultdict は定義したフォームの新しいエントリを追加するだけです。

class Tally(object):
    def __init__(self):
        self.count = 0
        self.lines = []
        self.values = []

from collections import defaultdict
summary = defaultdict(Tally)

for lineno,line in enumerate(csv_file):
    # first element in the line is assumed to be the key ("eggs", "bacon", etc.)
    key = line[0]
    # update the data values for this key
    summary[key].count += 1
    summary[key].lines.append(lineno)
    summary[key].values.append(line[1])
    # ... etc.

defaultdict を使用すると、「キーが summarydict にない場合: 新しいエントリを追加...」という面倒で繰り返しのオーバーヘッドが省けるため、コードはかなりクリーンなままです。

于 2011-05-26T12:03:25.907 に答える