Python 按值对字典进行分组

Python 按值对字典进行分组,python,dictionary,grouping,Python,Dictionary,Grouping,我有两本字典: data1 = [ {key1: 1, key2: 1, count: 3}, {key1: 2, key2: 1, count: 15}, {key1: 3, key2: 1, count: 12}, {key1: 1, key2: 2, count: 13}, {key1: 2, key2: 2, count: 8}, ] data2 = [ key1:{1: 'value1_1', 2: 'value1_2', 3: 'value1_3'}, key2:{1: 'va

我有两本字典:

data1 = [
{key1: 1, key2: 1, count:  3},
{key1: 2, key2: 1, count: 15},
{key1: 3, key2: 1, count: 12},
{key1: 1, key2: 2, count: 13},
{key1: 2, key2: 2, count:  8},
]

data2 = [
key1:{1: 'value1_1', 2: 'value1_2', 3: 'value1_3'},
key2:{1: 'value2_1', 2: 'value2_2'},
]
我想将这两个词典合并成一个大词典,如下所示:

new_data = [
{key1: 1, key1_name: 'value1_1', key2: 1, key2_name: 'value2_1', count:  3},
{key1: 2, key1_name: 'value1_2', key2: 1, key2_name: 'value2_1', count: 15},
{key1: 3, key1_name: 'value1_3', key2: 1, key2_name: 'value2_1', count: 12},
{key1: 1, key1_name: 'value1_1', key2: 2, key2_name: 'value2_2', count: 13},
{key1: 2, key1_name: 'value1_2', key2: 2, key2_name: 'value2_2', count:  8},
{key1: 3, key1_name: 'value1_3', key2: 2, key2_name: 'value2_2', count:  0},
]
new_data2 = [
{key1: {
value: 1, name: 'value1_1',
data: [
{value: 1, name: 'value2_1', count:   3},
{value: 2, name: 'value2_2', count:  13},
]},
{key1: {
value: 2, name: 'value1_2',
data: [
{value: 1, name: 'value2_1', count:  15},
{value: 2, name: 'value2_2', count:   8},
]},
{key3: {
value: 2, name: 'value1_3',
data: [
{value: 1, name: 'value2_1', count:  12},
{value: 2, name: 'value2_2', count:   0},
]}]
或者像这样:

new_data = [
{key1: 1, key1_name: 'value1_1', key2: 1, key2_name: 'value2_1', count:  3},
{key1: 2, key1_name: 'value1_2', key2: 1, key2_name: 'value2_1', count: 15},
{key1: 3, key1_name: 'value1_3', key2: 1, key2_name: 'value2_1', count: 12},
{key1: 1, key1_name: 'value1_1', key2: 2, key2_name: 'value2_2', count: 13},
{key1: 2, key1_name: 'value1_2', key2: 2, key2_name: 'value2_2', count:  8},
{key1: 3, key1_name: 'value1_3', key2: 2, key2_name: 'value2_2', count:  0},
]
new_data2 = [
{key1: {
value: 1, name: 'value1_1',
data: [
{value: 1, name: 'value2_1', count:   3},
{value: 2, name: 'value2_2', count:  13},
]},
{key1: {
value: 2, name: 'value1_2',
data: [
{value: 1, name: 'value2_1', count:  15},
{value: 2, name: 'value2_2', count:   8},
]},
{key3: {
value: 2, name: 'value1_3',
data: [
{value: 1, name: 'value2_1', count:  12},
{value: 2, name: 'value2_2', count:   0},
]}]
注1:请注意,每个组合的dict都有一个额外的行,其中键1=3,键2=2,该组合在“data2”dict中没有值,因此分配给此行的计数值为0

注2:我不确定用什么“更好”的方式来表示我的数据,比如新的数据1或新的数据2

注3:我希望尽可能使其通用,我不能假设级别数(在本例中为2级,键1和键2)是固定的,因此我需要考虑更多级别,这意味着能够处理3级甚至4级。 例如(具有3个级别):

任何帮助都将不胜感激。 谢谢你可以试试这个:

key2_name = "key2_name"
key1_name = "key1_name"
key3_name = "key3_name"
data1 = [
    {key1: 1, key2: 1, count:  3},
    {key1: 2, key2: 1, count: 15},
    {key1: 3, key2: 1, count: 12},
    {key1: 1, key2: 2, count: 13},
    {key1: 2, key2: 2, count:  8}
]

data2 = { key1:{1: 'value1_1', 2: 'value1_2', 3: 'value1_3'}, key2:{1: 'value2_1', 2: 'value2_2'}
}

for dict_ in data1:
    dict_["key1_name"] = data2[key1][dict_[key1]]
    dict_["key2_name"] = data2[key2][dict_[key2]]

# equivalent to:
for dict_ in data1:
    for k, v in (key1_name, key1), (key2_name, key2):
        dict_[k] = data2[v][dict_[v]]
打印(数据1)

[编辑3个键示例]

data1 = [
    {key1: 1, key2: 1, key3: 1, count:  3},
    {key1: 2, key2: 1, key3: 1, count: 15},
    {key1: 3, key2: 1, key3: 1, count: 12},
    {key1: 1, key2: 2, key3: 1, count: 13},
    {key1: 2, key2: 2, key3: 2, count:  8}
]
data2 = { key1:{1: 'value1_1', 2: 'value1_2', 3: 'value1_3'},
          key2:{1: 'value2_1', 2: 'value2_2'},
          key3:{1: 'value3_1', 2: 'value3_2'}
}
keys_name = [("%s_name"%v, v) for v in data2.keys()]
for dict_ in data1:
    for k, v in keys_name:
        dict_[k] = data2[v][dict_[v]]

但是我如何添加“缺少”行({key1:3,key1_name:'value1_3',key2:2,key2_name:'value2_2',count:0}),以及您是否看到了我的Note3?因为如果data1和data有3个键用于缺少的行,则此代码将不起作用,您希望count=0,仅此而已?不确定您的意思是什么,“混乱”行应该是:({key1:3,key1_name:'value1_3',key2:2,key2_name:'value2_2',count 0})正如我在前面的评论中所写的,我认为添加与data1不匹配的行不是一个好主意,因为这意味着要列出键之间的所有组合。还有,你将如何使用结果?但这正是我需要的,拥有所有可能的组合,以便稍后我可以在图表上显示它,对于所有未选择的组合,带0的条形图