在字典中打印特定的键子集

时间:2010-08-09 14:54:47

标签: python dictionary

我在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

我能想到的唯一方法就是使用正则表达式并浏览整个字典,但我不确定这是否是最好的方法(我也不熟悉正则表达式)。

感谢您的帮助。

5 个答案:

答案 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代替词典