如何使用键作为字符串创建嵌套的python字典?

时间:2018-10-08 23:45:36

标签: python regex dictionary for-loop nested

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

结果很好,是这样的: 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”。如果我给它一个数字,它可以正常工作。但是,我的字典键名是一个数字,描述性不强。

关于如何使它工作的任何想法?

1 个答案:

答案 0 :(得分:0)

问题在于这样做

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(...)

为了使它更好一点,您可以使用的数据结构是defaultdict模块中的collections

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