[英]How to create a nested python dictionary with keys as strings?
問題摘要:我正在嘗試創建一個嵌套的Python字典,其鍵由預定義的變量和字符串定義。 我正在從正則表達式輸出中填充字典。 這大多有效。 但是我遇到了一個錯誤,因為嵌套字典(不是主要的字典)不喜歡將鍵設置為字符串,而是需要一個整數。 這讓我感到困惑。 因此,我想問大家如何獲得帶有字符串鍵的嵌套python字典。
下面,我將指導您完成我的工作。 什么有效,什么無效。 從頂部開始:
# Regular expressions module
import re
# Read text data from a file
file = open("dt.cc", "r")
dtcc = file.read()
# Create a list of stations from regular expression matches
stations = sorted(set(re.findall(r"\n(\w+)\s", dtcc)))
結果很好,如下所示:stations = ['AAAA','BBBB','CCCC','DDDD']
# Initialize a new dictionary
rows = {}
# Loop over each station in the station list, and start populating
for station in stations:
rows[station] = re.findall("%s\s(.+)" %station, dtcc)
結果是好的,是這樣的:rows ['AAAA'] = ['AAAA 0.1132 0.32 P',...]
但是,當我嘗試使用字符串鍵創建子詞典時:
for station in stations:
rows[station] = re.findall("%s\s(.+)" %station, dtcc)
rows[station]["dt"] = re.findall("%s\s(\S+)" %station, dtcc)
我收到以下錯誤。
“ TypeError:列表索引必須是整數,而不是str”
我似乎不喜歡將第二個字典鍵指定為“ dt”。 如果我給它一個數字,它可以正常工作。 但是,我的字典鍵名是一個數字,描述性不強。
關於如何使它起作用的任何想法?
問題在於
rows[station] = re.findall(...)
您正在創建一個字典,其中工作站名稱為鍵, re.findall
方法的返回值作為值,它們恰好是列表。 因此,通過再次致電給他們
rows[station]["dt"] = re.findall(...)
在LHS row[station]
上的列表是由整數索引的,這是TypeError抱怨的。 例如,您可以執行rows[station][0]
,則將從正則表達式中獲得第一個匹配項。 您說過要嵌套詞典。 你可以做
rows[station] = dict()
rows[station]["dt"] = re.findall(...)
為了使它更好一點,可以使用的數據結構是collections
模塊中的defaultdict
。
defaultdict是一個字典,它接受默認類型作為其值的類型。 您輸入類型構造函數作為其參數。 例如dictlist = defaultdict(list)
定義了一個具有值列表的字典! 然后立即執行dictlist[key].append(item1)
是合法的,因為設置密鑰時會自動創建列表。
在你的情況下你可以做
from collections import defaultdict
rows = defaultdict(dict)
for station in stations:
rows[station]["bulk"] = re.findall("%s\s(.+)" %station, dtcc)
rows[station]["dt"] = re.findall("%s\s(\S+)" %station, dtcc)
在這里,您必須將第一個正則表達式結果分配給新鍵"bulk"
,但是您可以隨意調用它。 希望這可以幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.