协助听写

2024-10-04 03:18:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在写一本字典。在

我有一本这样的字典:

main_dict = {
    'A' : {'key1' : 'valueA1', 'key2' : 'valueA2'},
    'B' : {'key2' : 'valueB2', 'key3' : 'valueB3'},
    'C' : {'key3' : 'valueC3', 'key1' : 'valueC1'}}

我想执行以下逻辑:

^{pr2}$

结果如下:

{'key3': [['C', 'valueC3'], ['B', 'valueB3']], 
 'key2': [['A', 'valueA2'], ['B', 'valueB2']], 
 'key1': [['A', 'valueA1'], ['C', 'valueC1']]}

(我知道我可以使用defaultdict(list),但这只是一个例子)

我想使用dict理解来执行逻辑,目前我有以下内容:

d = {k : [m, v] for m, x in main_dict.items() for k, v in x.items()}

这不起作用,它只给出以下输出:

{'key3' : ['B', 'valueB3'],
'key2' : ['B', 'valueB2'],
'key1' : ['C', 'valueC1']}

这是为每个内部密钥找到的最后一个实例。。。在

我不知道如何正确地执行这个嵌套列表理解。我试过多种变体,都比上一个更糟。在


Tags: infor字典main逻辑dictkey2key1
3条回答

你可以试试这样的方法:

In [61]: main_dict
Out[61]: 
{'A': {'key1': 'valueA1', 'key2': 'valueA2'},
 'B': {'key2': 'valueB2', 'key3': 'valueB3'},
 'C': {'key1': 'valueC1', 'key3': 'valueC3'}}

In [62]: keys=set(chain(*[x for x in main_dict.values()]))

In [64]: keys
Out[64]: set(['key3', 'key2', 'key1'])

In [63]: {x:[[y,main_dict[y][x]] for y in main_dict if x in main_dict[y]] for x in keys}
Out[63]: 
{'key1': [['A', 'valueA1'], ['C', 'valueC1']],
 'key2': [['A', 'valueA2'], ['B', 'valueB2']],
 'key3': [['C', 'valueC3'], ['B', 'valueB3']]}

使用dict.setdefault更具可读性的解决方案:

^{pr2}$

一种选择是使用itertools.groupby

from itertools import groupby
from operator import itemgetter

main_dict = {
    'A' : {'key1' : 'valueA1', 'key2' : 'valueA2'},
    'B' : {'key2' : 'valueB2', 'key3' : 'valueB3'},
    'C' : {'key3' : 'valueC3', 'key1' : 'valueC1'}}

## Pull inner key, outer key and value and sort by key (prior to grouping)
x = sorted([(k2, [k1, v2]) for k1, v1 in main_dict.items() for k2, v2, in v1.items()])

## Group by key. This creates an itertools.groupby object that can be iterated
## to get key and value iterables
xx = groupby(x, key=itemgetter(0))

for k, g in xx:
    print('{0} : {1}'.format(k, [r[1] for r in list(g)]))

根据您的数据和性能要求,排序可能并不理想,因此值得分析。在

此外,它不会产生指定的dict,而是groupby对象。这可能已经足够满足您的需求了;迭代它会产生key和iterable。在

使用三个字典理解来完成这一任务,第三个dict理解是将前两个dict结合起来:

e = {k : [m, v] for m, x in main_dict.items() for k, v in x.items()}
f = {k : [m, v] for m, x in main_dict.items() for k, v in x.items() if [m,v] not in e.values()}
g = {k1 : [m, v] for k1,m in e.items() for k2,v in f.items() if k1==k2}

相关问题 更多 >