簡體   English   中英

將列表值附加到字典鍵

[英]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 表達式的解釋,但你必須定義一個defaultdictdefaultdict

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

請參閱在 Python 中實現嵌套字典的最佳方法是什么? .

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM