2016-05-13 164 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’} 

注意一个用户ID,我有多个jobids,walltimes和节点。
(len(jobids)==len(walltimes)==len(nodes)对于任何一个用户ID,但可以在用户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 

我知道这是错误的,但无法弄清楚如何获得追加的工作。我已经尝试了许多在这个网站上提供的建议。我需要追加(字典中)从循环中键入的最新值

以下是输出示例 - 它不为每个用户标识附加多个条目,而是仅为每个用户标识添加第一个值

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

这样的东西,如果userid不在pdict而不是'if userid in pdict'中, – SparkAndShine

回答

0

密钥'jobid'对应的值应该是字符串列表而不是字符串。如果你创建你的字典这样,你就可以将新的作业ID对列表只需:

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

我不记得了解释为什么要使用下面的代码lambda表达式,但你必须定义的defaultdict a defaultdict

pdict = defaultdict(lambda: defaultdict(list)) 

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

将工作。

0

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'].append(jobid)代替pdict[userid][‘jobid’] = pdict[userid][jobid].append(jobid)。还要考虑@Jasper的评论。

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

您正在寻找一个字典词典?AutoVivification是完美的解决方案。在Python中实现perl的autovivification功能。

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​ 

这使得一切都变得简单。请注意,pdict[userid]['jobid']的值应为列表[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?