簡體   English   中英

如何使用鍵作為字符串創建嵌套的python字典?

[英]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.

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