簡體   English   中英

Python有條件地為Dict添加鍵

[英]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}}
  1. 因為“run_number”變量重復,每次循環並重復時,都會用任何空的dict覆蓋它。

  2. 以下是實現目標的方法。

     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.

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