首页 文章

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

提问于
浏览
0

问题摘要:我正在尝试创建一个嵌套的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:list indices必须是整数,而不是str”

我似乎不喜欢我将第二个字典键指定为“dt” . 如果我给它一个数字,它就可以了 . 但是我的字典键名是一个数字,不是很具描述性 .

有关如何使这项工作的任何想法?

1 回答

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

    为了使它更好一点,您可以使用的数据结构是 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" 这里你可以随意调用它 . 希望这可以帮助 .

相关问题