我在Python中有一个字典,其中键是路径名。例如:
dict["/A"] = 0
dict["/A/B"] = 1
dict["/A/C"] = 1
dict["/X"] = 10
dict["/X/Y"] = 11
我想知道,给出任何关键字打印所有“子路径”的好方法。
例如,给定一个名为“print_dict_path”的函数来执行此操作,类似于
print_dict_path("/A")
或
print_dict_path("/A/B")
会打印出类似的内容:
"B" = 1
"C" = 1
我能想到的唯一方法就是使用正则表达式并浏览整个字典,但我不确定这是否是最好的方法(我也不熟悉正则表达式)。
感谢您的帮助。
答案 0 :(得分:5)
不使用正则表达式的一种可能性就是使用startswith
top_path = '/A/B'
for p in d.iterkeys():
if p.startswith(top_path):
print d[p]
答案 1 :(得分:1)
您可以使用str.find:
def print_dict_path(prefix, d):
for k in d:
if k.find(prefix) == 0:
print "\"{0}\" = {1}".format(k,d[k])
答案 2 :(得分:1)
嗯,你肯定要在整个字典中循环。
def filter_dict_path( d, sub ):
for key, val in d.iteritems():
if key.startswith(sub): ## or do you want `sub in key` ?
yield key, val
print dict(filter_dict_path( old_dict, sub ))
您可以使用适当的数据结构来加快速度:树。
答案 3 :(得分:1)
你的字典结构是否已修复?使用嵌套字典做这件事会更好:
{
"A": {
"value": 0
"dirs": {
"B": {
"value": 1
}
"C": {
"value": 1
}
}
"X": {
"value": 10
"dirs": {
"Y": {
"value": 11
}
}
这里的底层数据结构是一棵树,但Python没有内置的。
答案 4 :(得分:1)
这会删除一个级别的缩进,这可能会使for循环体中的代码在某些情况下更具可读性
top_path = '/A/B'
for p in (p for p in d.iterkeys() if p.startswith(top_path)):
print d[p]
如果您发现性能有问题,请考虑使用trie代替词典