我try 使用同一词典中的键来扩展词典的值.换言之,我try 替换dic个值(用另一个/可能扩展的集替换现有集).当值包含字典中的键时,会发生扩展.

输入:

dic = {
    '10': {'01', '02'},
    '11': {'03', '04'},
    '20': {'05', '10'},
    '21': {'06', '11'},
    '30': {'07', '20'},
    '40': {'08', '21', '30'},
    '50': {'09', '40'}
}

预期输出:

{
    '10': {'01', '02'},
    '11': {'03', '04'},
    '20': {'05', '01', '02'},
    '21': {'06', '03', '04'},
    '30': {'07', '05', '01', '02'},
    '40': {'08', '06', '03', '04', '07', '05', '01', '02'},
    '50': {'09', '08', '06', '03', '04', '07', '05', '01', '02'}
}

我试图创建一个递归函数...

def transform_dic(d):
    def func(k):
        v = d.get(k, k)
        if v != k:
            for e in v:
                v = func(v)
        return v
    d2 = {}
    for k, v in d.items():
        d2[k] = {func(i) for i in v}
    return d2

print(transform_dic(dic))

类型

推荐答案

要递归展开的是dict中的集合,而不是dict本身.你总是只有一句话.

因此,我认为编写一个递归函数来扩展一个集合,然后使用这个函数来扩展dict更容易.

def expanded_dict(d):
    return {k: expanded_set(v, d) for k,v in d.items()}

def expanded_set(s, d):
    return {
        y
        for x in s
            for y in (expanded_set(d[x], d) if x in d
                      else (x,))
    }

注意,expanded_set返回一个新的集合,而不修改输入集或输入dict;and expanded_dict返回新的dict,而不修改输入dict.

明确函数是返回一个新对象,还是修改输入对象,是一种很好的做法.例如,sorted返回一个新列表而不修改其输入,而list.sort修改列表而不返回任何内容.

下面是一个函数,它通过修改dict而不返回任何内容来扩展dict:

def expand_dict(d):
    stable = False
    while not stable:
        stable = True
        for k in d:
            for x in list(d[k]):
                if x in d:
                    d[k].remove(x)
                    d[k].update(d[x])
                    stable = False

使用您的示例进行测试:

dic = {
    '10': {'01', '02'},
    '11': {'03', '04'},
    '20': {'05', '10'},
    '21': {'06', '11'},
    '30': {'07', '20'},
    '40': {'08', '21', '30'},
    '50': {'09', '40'}
}

print(expanded_dict(dic))
# {'10': {'01', '02'}, '11': {'03', '04'}, '20': {'01', '05', '02'}, '21': {'03', '06', '04'}, '30': {'07', '01', '02', '05'}, '40': {'04', '06', '08', '05', '02', '01', '07', '03'}, '50': {'04', '06', '08', '02', '05', '01', '07', '09', '03'}}

print(dic)
# {'10': {'01', '02'}, '11': {'03', '04'}, '20': {'10', '05'}, '21': {'11', '06'}, '30': {'07', '20'}, '40': {'08', '30', '21'}, '50': {'40', '09'}}

expand_dict(dic)
# no return value

print(dic)
# {'10': {'01', '02'}, '11': {'03', '04'}, '20': {'01', '02', '05'}, '21': {'03', '06', '04'}, '30': {'01', '05', '07', '02'}, '40': {'04', '06', '08', '05', '02', '01', '07', '03'}, '50': {'04', '06', '08', '05', '02', '01', '07', '09', '03'}}

Python相关问答推荐

沿着数组中的轴计算真实条目

Python库:可选地支持numpy类型,而不依赖于numpy

如何在Python中并行化以下搜索?

有没有一种方法可以从python的pussompy比较结果中提取文本?

python中字符串的条件替换

使用Python和文件进行模糊输出

* 动态地 * 修饰Python中的递归函数

如何在BeautifulSoup/CSS Select 器中处理regex?

重置PD帧中的值

巨 Python :逆向猜谜游戏

polars:有效的方法来应用函数过滤列的字符串

BeautifulSoup-Screper有时运行得很好,很健壮--但有时它失败了::可能这里需要一些更多的异常处理?

mdates定位器在图表中显示不存在的时间间隔

删除特定列后的所有列

为什么dict. items()可以快速查找?

在pandas中,如何在由两列加上一个值列组成的枢轴期间或之后可靠地设置多级列的索引顺序,

随机森林n_估计器的计算

Polars定制函数返回多列

如何在Polars中创建条件增量列?

在Pandas 中,有没有办法让元组作为索引运行得很好?