[英]Python Add Key to Dict conditionally
我正在嘗試從標題列表中生成一個dict,它將“數據列”關聯到同一個實驗。 例如,我想轉:
headers = ["A_1","A_2","A_3","B_1","B_2","B_3"]
成
cols = { 1 : {'A' : 0, 'B' : 3}, 2: {'A' : 1, 'B' : 5} ... }
我的代碼如下:
cols = {}
headers = ["A_1","A_2","A_3","B_1","B_2","B_3"]
col_number = 0
for header in headers:
run_number = header[-1:]
cols[ run_number ] = {}
if "A_" in header:
cols[ run_number ][ 'A' ] = col_number
if "B_" in header:
cols[ run_number ][ 'B' ] = col_number
col_number += 1
print cols
這僅輸出最后的“B”列:
{'1': {'B':3}, '2':{'B':5}... }
但是,如果我在命令shell上嘗試一個簡單的實驗,這個符號似乎運行良好......
cols = {}
cols[1] = {}
cols[1]['A'] = 1
cols[1]['B'] = 2
print cols
>> {'1' : {'A':1,'B':2} }
為什么?
編輯:我猜需要另一組眼睛。 問題在於循環中的這一行......
cols[ run_number ] = {}
每次到達預先存在的run_number的列時,它會將cols [run_number]覆蓋為空dict。
你的循環覆蓋了這個重要的變量並將其設置為空的dict:
cols[ run_number ] = {}
這意味着它通過各種數字的“A_”字符串,然后當它進入“B_”字符串時,它會覆蓋它已經為“A_”字符串創建的所有run_number
鍵。
你應該嘗試類似以下的東西:
if run_number not in cols:
cols[ run_number ] = {}
或者,您可以嘗試使用defaultdict
您應該更改為以下代碼行:
if run_number not in cols:
cols[ run_number ] = {}
我測試過,下面的代碼有效:
for header in headers:
run_number = header[-1:]
if run_number not in cols:
cols[ run_number ] = {}
if "A_" in header:
cols[ run_number ][ 'A' ] = col_number
if "B_" in header:
cols[ run_number ][ 'B' ] = col_number
col_number += 1
首先,您可以使用enumerate()
讓Python自動跟蹤計數。 其次,正如其他人所說,你用新的字典鍵覆蓋你的字典鍵而不是添加到現有的字典中。
以下內容適合您的情況:
cols = {}
for col, header in enumerate(headers):
typ, _, key = header.partition('_')
if key not in cols:
cols[key] = {}
cols[key][typ] = col
根據您的數據, cols
是:
{'1': {'A': 0, 'B': 3}, '2': {'A': 1, 'B': 4}, '3': {'A': 2, 'B': 5}}
因為“run_number”變量重復,每次循環並重復時,都會用任何空的dict覆蓋它。
以下是實現目標的方法。
def answer(): headers = ["A_1","A_2","A_3","B_1","B_2","B_3"] cols = {} cols[1] = {} cols[2] = {} cols[3] = {} for header in headers: cols[int(header[-1:])][str(header[:-1])] = headers.index(header) return cols print answer()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.