[英]How can I find the key in a dict whose matching value, which is a list, contains X?
[英]how can I append to a list which is value of a key in dict?
我遇到一種情況,我正在解析文件並收集統計信息。 我想將這些統計信息存儲在具有最終值列表的嵌套字典中。 在處理文件時,我想擴展列表。
例如我的字典結構是這樣的
data_dict
{ "aa1" :
{ 'aa' : []}
{ 'bb' : [] }
"aa2" :
{ 'ab' : []}
{ 'ba' : [] }
}
現在,當我解析文件時,例如要將值附加到最后一個列表中,在第一次出現數據時,我的字典應該像這樣。
data_dict
{ "aa1" :
{ 'aa' : ['a0']}
{ 'bb' : ['a1'] }
"aa2" :
{ 'ab' : ['b0']}
{ 'ba' : ['b1'] }
}
在第二個這樣的事情
data_dict
{ "aa1" :
{ 'aa' : ['a0', 'a01']}
{ 'bb' : ['a1', 'a11'] }
"aa2" :
{ 'ab' : ['b0', 'b01']}
{ 'ba' : ['b1', 'b11'] }
}
另外,我沒有將dict鍵初始化為任何東西,也不在第一次匹配時創建鍵。 誰能建議我如何實現這一目標?
請注意,我正在使用自動生存來初始化我的data_dict,它最初不包含任何內容。
這是我要解析的樣本數據
DATETIME TYPE TAG COUNT MEAN 1% 10% 20% 30% 40% 50% 60% 70% 80% 90% 99%
20151109044056 LS_I aa8 57 80,493,122 8,931,000 8,937,000 8,944,000 8,974,000 9,073,000 21,262,000 28,419,000 35,794,000 148,920,000 316,408,000 447,902,000
20151109044056 LS_I aa0 6,893 9,008,024 8,862,000 8,913,000 8,941,000 8,964,000 8,984,000 9,006,000 9,028,000 9,049,000 9,071,000 9,102,000 9,170,000
20151109044056 LS_I aa1 6,062 9,018,094 8,867,000 8,913,000 8,938,000 8,961,000 8,983,000 9,003,000 9,025,000 9,048,000 9,071,000 9,103,000 9,175,000
20151109044056 LS_I aa2 2,776 9,030,621 8,929,000 8,967,000 8,987,000 8,999,000 9,012,000 9,024,000 9,037,000 9,050,000 9,065,000 9,087,000 9,161,000
20151109044056 LS_I aa3 1,074 9,028,744 8,925,000 8,970,000 8,988,000 9,002,000 9,016,000 9,026,000 9,039,000 9,051,000 9,067,000 9,089,000 9,138,000
20151109044056 LS_I aa4 6,060 9,003,651 8,874,000 8,935,000 8,958,000 8,976,000 8,991,000 9,005,000 9,019,000 9,033,000 9,049,000 9,071,000 9,121,000
20151109044056 LS_I aa5 5,453 9,003,993 8,874,000 8,936,000 8,959,000 8,976,000 8,991,000 9,004,000 9,018,000 9,032,000 9,048,000 9,071,000 9,126,000
20151109044056 LS_I aa6 16,384 328 111 165 190 208 227 253 301 362 434 551 997
20151109044056 LS_I aa7 16,384 316 58 65 70 76 87 137 308 395 512 702 1,562
所以我的字典將第一個鍵作為Tag列,將第二個鍵作為%column之一,然后此鍵的值就是完整文件中該值的所有實例。
這是我的處理代碼,無法正常工作。
while re.match("\d{14}\s.*", curr_line):
lat_data = curr_line.split()
tag = lat_data[header.index("TAG")]
for item in range(len(header)):
col = header[item]
if '%' in col or\
"COUNT" in col or\
"MEAN" in col:
self.data_dict[tag][col].append(lat_data[item])
curr_line = lat_file.next()
首先: has_key
已過時(Py3中已棄用); 您可以in
支票中直接使用。 其次,您嘗試使用has_key
是荒謬的[tag][col]
並不是沒有要索引的東西的合法語法(如果沒有索引/查找內容,它看起來像兩個背對背的單個元素list
文字,這不是法律語法)。 該測試的解決方法是分別測試每個組件(由於您知道該值存在,因此可以追加每個組件):
if tag in self.data_dict and col in self.data_dict[tag]:
self.data_dict[tag][col].append(whatever_you_want_to_append)
旁注:您幾乎永遠不會想要for i in range(len(something)):
這是來自C樣式for
循環背景的症狀。 除了獲取值之外,您實際上並沒有將索引用於任何其他用途,因此請替換:
for item in range(len(header)):
col = header[item]
與:
for col in header:
運行得更快,更慣用,等等。如果出於某種原因也需要索引,那么enumerate
是:
for i, col in enumerate(header):
更新 :您使用更多信息更新了問題,因此您似乎需要並行迭代lat_data
。 在這種情況下,請執行以下操作:
for col, lat in zip(header, lat_data):
...
if tag in self.data_dict and col in self.data_dict[tag]:
self.data_dict[tag][col].append(lat)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.