2016-05-13 68 views
1

pythonスクリプトを作成しようとしていて、辞書がついています。私は他のフォーラムのいくつかを読んだが、どこにも出てこないようである。私は非常に新しいPythonプログラマーですので、優しくしてください。リストの値を辞書のキーに追加する

1)は、このような辞書の設定::私は何をしたいか

{'Name':'userid','jobid:jobid','walltime:walltime,'nodes:nds'}

2)から作成されたエントリと外部関数呼び出しのリストを反復して辞書を移入するための情報を抽出し

3)問題:私は適切なキーたとえば

にエントリを追加する方法を見つけ出すことはできませんが、私はこれをしたい:

{‘Name’:’jose’,’jobid’:’001,002,003,005’,’walltime:32:00,240:00,04:00,07:00’,’nodes’:32,32,500’} 

1つのユーザーIDについては、複数のジョブID、壁紙、ノードがあります。いずれかのユーザーID用
(len(jobids)==len(walltimes)==len(nodes)が、私は、各ユーザ名の最初の値を見つけるためのスクリプトを取得することができていますが、それは追加されません)

ユーザーIDごとに異なることができます。どうすればこれを追加することができますか?ここで

は、私は、これは間違っている知っているが、アペンド作業を取得する方法を見つけ出すことはできません

from collections import defaultdict 
pdict = defaultdict(list) 

start the loop: 

# get new values – add these to the dictionary keyed 
# on username (create a new entry or append to existing entry) 
    … 
    (jobid,userid,jobname, sessid, nds, tsk, walltime,rest)= m.groups() 

    ... 
    if userid in pdict: 
     print "DEBUG: %s is currently in the dictionary -- appending entries" %(userid) 
     pdict[userid][‘jobid’] = pdict[userid][jobid].append(jobid)  I 
    # repeat for nodes, walltime, etc 

    if not userid in pdict: 
     print "DEBUG: %s is not in the dictionary creating entry" %(userid) 
     pdict[userid] = {} # define a dictionary within a dictionary with key off userid 
     pdict[userid]['jobid'] = jobid 
     pdict[userid]['jobname'] = jobname 
     pdict[userid]['nodes'] = nds 
     pdict[userid]['walltime'] = walltime 

を試してきたものです。私はこのサイトで提供されている提案の多くを試しました。ユーザーIDに合わせてループから最新の値を追加する必要があります

これは出力の例です。

userid jmreill contains data: {'nodes': '1', 'jobname': 'A10012a_ReMig_Q', 'walltime': '230:0', 'jobid': '1365582'}

userid igorysh contains data: {'nodes': '20', 'jobname': 'emvii_Beam_fwi6', 'walltime': '06:50', 'jobid': '1398100'}

お勧めはありますか?これは簡単なはずですが、私はそれを理解できません!

+0

エラーが表示されますか?おそらく 'AttributeError: 'str'オブジェクトに属性 'append''がありませんか?複数の値を保持するキーのリストを作成しなければならないと、 'append()'することができます。それで 'pdict [userid] ['jobid'] = [jobid]' – Jasper

+0

のようなものです。もし 'もしpdidの中にuseridがありません。 – SparkAndShine

答えて

0

キー'jobid'に対応する値は、文字列ではなく文字列のリストでなければなりません。私は、次のコードでは、ラムダ式を使用する理由の説明を覚えてカントが、あなたはのdefaultdictを定義する必要が

pdict[userid]['jobid'].append(jobid) 
0

:あなたがこの方法をあなたの辞書を作成する場合は、単純にして、リストに新しいジョブID年代を追加することができますa defaultdict

pdict = defaultdict(lambda: defaultdict(list)) 

pdict[userid][‘jobid’].append('1234') 

となります。

0

append()メソッドはリストを返しません...それは適所で修正されます。また、あなたは(角括弧を使用して)リストとしてあなたの要素を初期化する必要があります:APPENDが値を返さない

if userid in pdict: 
    print "DEBUG: %s is currently in the dictionary -- appending entries" %(userid) 
    pdict[userid][jobid].append(jobid) ## just call append here 
# repeat for nodes, walltime, etc 

if not userid in pdict: 
    print "DEBUG: %s is not in the dictionary creating entry" %(userid) 
    pdict[userid] = {} # define a dictionary within a dictionary with key off userid 
    pdict[userid]['jobid'] = [jobid,] ## initialize with lists 
    pdict[userid]['jobname'] = [jobname,] 
    pdict[userid]['nodes'] = [nds,] 
    pdict[userid]['walltime'] = [walltime,] 
0

、それは場所にリストを変更し、あなたは右の「ジョブID」を引用するのを忘れ等しい。したがって、pdict[userid][‘jobid’] = pdict[userid][jobid].append(jobid)pdict[userid]['jobid'].append(jobid)に置き換える必要があります。 @ジャスパーからのコメントも考慮に入れてください。

1
from collections import defaultdict 

pdict = defaultdict(dict) 

start the loop: 

# get new values – add these to the dictionary keyed 
# on username (create a new entry or append to existing entry) 
    … 
    (jobid,userid,jobname, sessid, nds, tsk, walltime,rest)= m.groups() 

    ... 
    if userid in pdict: 
     print "DEBUG: %s is currently in the dictionary -- appending entries" %(userid) 
     pdict[userid][jobid].append(jobid) 
    # repeat for nodes, walltime, etc 

    if userid not in pdict: 
     print "DEBUG: %s is not in the dictionary creating entry" %(userid) 
     pdict[userid]['jobid'] = [jobid] 
     pdict[userid]['jobname'] = jobname 
     pdict[userid]['nodes'] = nds 
     pdict[userid]['walltime'] = walltime 
+0

そして、 'pdict [userid] ['jobid'] = jobid'を' pdict [userid] ['jobid'] = [jobid] ' – SparkAndShine

+0

@sparkandshineと置き換えてください。ありがとう。 – malbarbo

0

あなたはdictsのdictを探していますか?AutoVivificationは完璧なソリューションです。 perlのautovivification機能をPythonで実装してください。

class AutoVivification(dict): 
    """Implementation of perl's autovivification feature.""" 
    def __getitem__(self, item): 
     try: 
      return dict.__getitem__(self, item) 
     except KeyError: 
      value = self[item] = type(self)() 
      return value​ 

これですべてが簡単になります。 jobidのように、の値はjobidの代わりに[jobid]のリストでなければならないことに注意してください。

pdict = AutoVivification() 

if userid in pdict: 
    pdict[userid]['jobid'].append(jobid) 
else: 
    pdict[userid]['jobid'] = [jobid] # a list 

What is the best way to implement nested dictionaries in Python?を参照してください。

関連する問題