我有一个单词列表,我想将它们存储在嵌套字典中.
以下是样本清单: -
words = ['Apple','Ape','Bark','Barn']
Run Code Online (Sandbox Code Playgroud)
我要创建的字典如下: -
{'A':{'P':{'E':{},
'P':{'L':{'E':{}}}}},
'B':{'A':{'R':{'K':{},'N':{}}}}}
Run Code Online (Sandbox Code Playgroud)
这些词不区分大小写.
我有一个Python dict,它来自于通常读取YAML文件
yaml.load(stream)
Run Code Online (Sandbox Code Playgroud)
我想以编程方式更新YAML文件给定要更新的路径,如:
1组,选项1,option11,值
并将生成的dict再次保存为yaml文件.考虑到路径是动态的(假设用户能够通过我使用Cmd创建的简单CLI进入路径),我面临更新二项决定的问题.
有任何想法吗?
谢谢!
更新 让我在这个问题上更加具体:问题是更新字典的一部分,我事先并不知道结构.我正在开发一个项目,其中所有配置都存储在YAML文件中,我想添加一个CLI以避免必须手动编辑它们.这是一个示例YAML文件,使用PyYaml加载到字典(config-dict):
config:
a-function: enable
b-function: disable
firewall:
NET:
A:
uplink: enable
downlink: enable
B:
uplink: enable
downlink: enable
subscriber-filter:
cancellation-timer: 180
service:
copy:
DS: enable
remark:
header-remark:
DSC: enable
remark-table:
port:
linkup-debounce: 300
p0:
mode: amode
p1:
mode: bmode
p2:
mode: amode
p3:
mode: bmode
Run Code Online (Sandbox Code Playgroud)
我用Cmd创建了CLI,即使使用自动完成它也能很好地工作.用户可以提供如下行:
config port p1 mode amode
Run Code Online (Sandbox Code Playgroud)
所以,我需要编辑:
config-dict ['config'] ['port'] ['p1'] ['mode']并将其设置为'amode'.然后,使用yaml.dump()再次创建该文件.另一条可能的路线是:
config a-function enable
Run Code Online (Sandbox Code Playgroud)
所以config-dict ['config'] ['a-function']必须设置为'enable'.
我的问题是更新字典时.如果Python传递值作为引用将很容易:只需遍历dict直到找到正确的值并保存它.实际上这就是我为Cmd自动完成所做的事情.但我不知道如何进行更新.
希望我现在更好地解释自己!
提前致谢.
在一般情况下,我们如何对嵌套dicts进行递归访问?
from collections import defaultdict
D = lambda: defaultdict(D)
d = D()
keys = ['k1', 'k2', 'k3']
value = 'v'
if len(keys) == 3:
k1, k2, k3 = keys
d[k1][k2][k3] = value
else:
???
Run Code Online (Sandbox Code Playgroud)
我走下去的一些可怕的路径reduce,d.__getitem__并d.__setitem__但觉得有肯定是一个更优雅的方式...
我正在循环遍历严重嵌套的列表字典(系统信息)并以这种格式存储密钥的完整路径:
.children[0].children[9].children[0].children[0].handle = PCI:0000:01:00.0
.children[0].children[9].children[0].children[0].description = Non-Volatile memory controller
.children[0].children[9].children[0].children[0].product = Samsung Electronics Co Ltd
.children[0].children[9].product = Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D DMI2
.children[2].product = PWS-406P-1R
Run Code Online (Sandbox Code Playgroud)
接下来,读入完整路径并将其与系统信息(数据)进行比较.如何将完整路径转换为此格式?
Data['children'][0]['children'][9]['children'][0]['children'][0]['handle']
Data['children'][0]['children'][9]['product]'
Data['children'][2]['product']
Run Code Online (Sandbox Code Playgroud)
我可以这样做:
data = re.findall(r"\.([a-z]+)\[(\d+)\]", key, re.IGNORECASE)
[('children', '0'), ('children', '9'), ('children', '0'), ('children', '0')]
[('children', '0'), ('children', '9'), ('children', '0'), ('children', '0')]
[('children', '0'), ('children', '9'), ('children', '0'), ('children', '0')]
[('children', '0'), ('children', '9')]
[('children', '2')]
Run Code Online (Sandbox Code Playgroud)
如何转换其中一个元组列表才能执行以下操作:
if Data['children'][2]['product'] == expected:
print('pass')
Run Code Online (Sandbox Code Playgroud) 假设我有一个键列表
key_lst = ["key1", "key2", "key3"]
Run Code Online (Sandbox Code Playgroud)
我有一个价值
value = "my_value"
Run Code Online (Sandbox Code Playgroud)
以及my_dict具有此结构的示例dict
{
"key1": {
"key2": {
"key3": "some_value"
}
},
}
Run Code Online (Sandbox Code Playgroud)
如何通过遍历/循环value来动态地将变量中的新值分配给?my_dict["key1"]["key2"]["key3"]key_lst
我不能只说my_dict["key1"]["key2"]["key3"] = value因为钥匙和钥匙的数量正在改变.我总是在列表中获取密钥(我必须保存值的路径)...
我正在使用Python 3.7
给出一个像这样的字符串列表:
a_list_of_keys = ['a key', 'heres another', 'oh hey a key']
Run Code Online (Sandbox Code Playgroud)
什么是从dict中检索嵌套系列键的方法
the_value_i_want = some_dict['a key']['heres another']['oh hey a key']
Run Code Online (Sandbox Code Playgroud) 我有一个文本文件abc.txt:
abc/pqr/lmn/xyz:pass
abc/pqr/lmn/bcd:pass
Run Code Online (Sandbox Code Playgroud)
我需要解析这些语句,输出应该在嵌套字典中,如下所示:
{'abc':{'pqr':{'lmn':{'xyz':{'pass':1},{'bcd':{'pass':1}}}}}}
Run Code Online (Sandbox Code Playgroud)
其中 1 是'pass'计数。
我可以做这样的事情:
import re
d={}
p=re.compile('[a-zA-z]+')
for line in open('abc.txt'):
for key in p.findall(line):
d['key']={}
Run Code Online (Sandbox Code Playgroud) 我有一个如下列表
['item1', 'item2', 'item3', 'item4']
Run Code Online (Sandbox Code Playgroud)
我想从上面的列表中构建一个字典,如下所示
{
"item1": {
"item2": {
"item3": "item4"
}
}
}
Run Code Online (Sandbox Code Playgroud)
列表中的项目数是动态的.字典将是嵌套字典,直到它到达列表的最后一个元素.有没有办法在python中做到这一点?
说我有两个这样的对象:
d={'a':{'z':1,'y':2},'b':{'z':0,'y':4}}
k=('a','y')
Run Code Online (Sandbox Code Playgroud)
我如何使用这两个对象来获取:
>>> d['a']['y']
2
Run Code Online (Sandbox Code Playgroud)
我需要它是动态的,所以这不起作用:
d[k[0]][k[1]]
Run Code Online (Sandbox Code Playgroud)
因为我并不总是确定字典的嵌套深度.k可以有一个或多个元素.
itemgetterpython中是否有递归。假设你有一个像
d = {'a': (1,2,3), 'b': {1: (5,6)}}
Run Code Online (Sandbox Code Playgroud)
我想从d['a']? 据我所知itemgetter只会做一个级别,即让我a或b或两者兼而有之。
是否有一些巧妙的方式itertools与 with结合itemgetter以产生所需的结果。
所以基本上我想要能够打电话的是
from operator import itemgetter
d = {'a': (1,2), 'b': (4, (5,))}
itemgetter({'a': 0})(d) --> 1
itemgetter({'b': 0})(d) --> 4
itemgetter({'b': {1: 0}})(d) --> 5
d = {'a': {'b': (1,2,3)}}
itemgetter({'a': {'b': 2}})(d) --> 3
Run Code Online (Sandbox Code Playgroud)