[英]Appending list values to a dictionary key
我正在嘗試創建一個 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’}
請注意,對於一個 userid,我有多個 jobid、walltime 和節點。
(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
這是輸出的示例 - 它不會為每個用戶 ID 附加多個條目,而是僅獲取每個用戶 ID 的第一個值
userid jmreill 包含數據:{'nodes': '1', 'jobname': 'A10012a_ReMig_Q', 'walltime': '230:0', 'jobid': '1365582'}
userid igorysh 包含數據:{'nodes': '20', 'jobname': 'emvii_Beam_fwi6', 'walltime': '06:50', 'jobid': '1398100'}
有什么建議? 這應該很容易,但我無法弄清楚!
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
鍵'jobid'
對應的值應該是一個字符串列表而不是一個字符串。 如果您以這種方式創建字典,則只需通過以下方式將新作業 ID 添加到列表中:
pdict[userid]['jobid'].append(jobid)
我不記得為什么在下面的代碼中使用 lambda 表達式的解釋,但你必須定義一個defaultdict
的defaultdict
:
pdict = defaultdict(lambda: defaultdict(list))
pdict[userid][‘jobid’].append('1234')
將工作。
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,]
append 不返回值,它會就地修改列表,並且您忘記在 equals 的右側引用“jobid”。 所以你應該用pdict[userid]['jobid'].append(jobid)
替換pdict[userid]['jobid'] = pdict[userid][jobid].append(jobid)
pdict[userid]['jobid'].append(jobid)
。 還要考慮@Jasper 的評論。
您正在尋找字典的字典嗎? AutoVivification
是完美的解決方案。 在 Python 中實現 perl 的自動激活功能。
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.