【问题标题】:How to create a nested python dictionary with keys as strings?如何使用键作为字符串创建嵌套的python字典?
【发布时间】:2018-10-08 23:45:36
【问题描述】:

问题摘要:我正在尝试创建一个嵌套的 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)))

结果很好,是这样的: 车站 = ['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)

结果很好,是这样的: 行['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] 指向一个列表,而不是字典。这是因为您将列表分配给外部字典键的此语句:rows[station] = re.findall("%s\s(.+)" %station, dtcc)。我不确定您要做什么,但开始可能是:rows[station] = dict.fromkeys(re.findall("%s\s(.+)" %station, dtcc))

标签: python regex dictionary for-loop nested


【解决方案1】:

问题在于这样做

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",但您可以随意调用它。希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-17
    • 2010-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-07
    • 2023-01-18
    相关资源
    最近更新 更多