python-3.x 如何将字典中的值转换为键,并使用后续值构建嵌套字典

ldfqzlk8  于 2023-02-01  发布在  Python
关注(0)|答案(5)|浏览(126)

我是dict结构的新手,我有以下内容:

d = {'a': 'aa', 'b': 'bb', 'c': 'cc', 'x':111, 'y': 222, 'z':333}

我想把它改成下面的结构:

d2 = {'a': 'aa', 'b': 'bb', 'cc':{ 'x':111, 'y': 222, 'z':333}}

基本上,给定keyvalue将成为key本身,而后续的values将作为嵌套dict进入此新键。xyz的值仅是说明性的,它们可以是浮点数或整数。始终在c键之后,将得到需要放入c中的值。谢谢

llycmphe

llycmphe1#

下面是适用于更一般情况的稍长的解决方案:

d = {'a': 'aa', 'b': 'bb', 'c': 'cc', 'x':111, 'y': 222, 'z':333}

slicing_key = 'c'
svalue = d[slicing_key]

d2 = {}
d2[svalue] = {}

# List of all keys
all_keys = list(d.keys())
# Index of the key where you slice
slice_ind = all_keys.index(slicing_key)
# Unchanged entries
orig_keys = all_keys[:slice_ind]
# Keys for entries in the inner dict
new_keys = all_keys[slice_ind+1:]

# Assemble the new dictionary
for key in orig_keys:
    d2[key] = d[key]

for key in new_keys:
    d2[svalue][key] = d[key]

首先预定义输出字典,然后根据切片键标准拆分所有键的列表,最后组装新字典。
注意,这依赖于keys()返回的列表是有序的,现在应该是这样的,但是为了安全起见,您也可以对它进行排序,all_keys = list(sorted(d.keys()))

z9ju0rcb

z9ju0rcb2#

一个棘手的解决方案是使用pandas中的pandas.DataFrame * 构造函数 *:

import pandas as pd

def nest_dict(d, val):
    v = next((k for k, v in d.items() if v == val), None)
    df = pd.DataFrame(d, index=[0])
    idx = df.columns.get_loc(v)
    out = df.iloc[:, :idx].to_dict("records")[0]
    out[val] = df.iloc[:, idx+1:].to_dict("records")[0]
    return out

d2 = nest_dict(d1, "cc")

输出:

print(d2)
#{'a': 'aa', 'b': 'bb', 'cc': {'x': 111, 'y': 222, 'z': 333}}
t5fffqht

t5fffqht3#

这似乎是一个模糊的问题,应该提供更多关于约束/规则的细节。然而,有了给定的细节,这里有一段代码应该会帮助你解决这个问题。

import itertools
def slice_dic(dic, k):
    keys = list(dic)
    lts = keys.index(k)
    d = dict(itertools.islice(dic.items(), lts))
    d2 = dict(itertools.islice(dic.items(), lts+1,len(keys)))
    d[list(dic.values())[lts]] = d2
    return d

input_dict = {'a': 'aa', 'b': 'bb', 'c': 'cc', 'x':111, 'y': 222, 'z':333}
slice_dic(input_dict, "c") #slices the dictionary at c 
                  #and keeps all subsequent key:value pairs as a dictinoary

上面的代码片段给出了以下输出:

{'a': 'aa', 'b': 'bb', 'cc': {'x': 111, 'y': 222, 'z': 333}}
toe95027

toe950274#

提供的信息有限,并且不使用任何库

def spl_dict(d, pos):
    d2 = dict(list(d.items())[:pos-1])
    d2[list(d.values())[pos-1]]= dict(list(d.items())[pos:])
    return d2
print(spl_dict(d,3))

输出:

{'a': 'aa', 'b': 'bb', 'cc': {'x': 111, 'y': 222, 'z': 333}}
ijnw1ujt

ijnw1ujt5#

假设您持有输入dict的插入顺序,使用itertools.groupby util获取基于c键的顺序组的解决方案如下:

from itertools import groupby

d = {'a': 'aa', 'b': 'bb', 'c': 'cc', 'x':111, 'y': 222, 'z':333}
head, c, tail = [list(gr) for _, gr in groupby(d.items(), lambda t: t[0] == 'c')]
c_k, c_v = c[0]  # for c key
res = {**dict(head), **{c_v: dict(tail)}}
{'a': 'aa', 'b': 'bb', 'cc': {'x': 111, 'y': 222, 'z': 333}}

相关问题