2016-01-22 4 views
0

У меня есть 2 словаря:группа словарей по значению

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'}, 
] 

Я хотел бы объединить эти 2 словаря в 1 большой словарь, который будет выглядеть так:

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 смотрите, что каждый из Комбен ed dict имеет дополнительную строку с ключом 1 = 3 и ключ 2 = 2, что эта комбинация не имела значения в dict 'data2', поэтому значение счета, которое было присвоено этой строке, равно 0.

Note2: Я не уверен, что такое «лучший» способ представления моих данных, таких как new_data1 или new_data2.

Note3: Я хотел бы сделать это как родовые, насколько это возможно, я не могу предположить, что число уровней (в данном случае 2 уровня, Key1 и Клавишу2) будет исправлен, так что мне нужно, чтобы позволить более высокий уровень, означающий способность обрабатывать 3 или даже 4 уровня. Например (с 3 уровней):

data = [ 
{key1: 1, key1_name: 'value1_1', key2: 1, key2_name: 'value2_1', key3: 1, key3_name: 'value3_1', count: 3}, 
{key1: 1, key1_name: 'value1_1', key2: 1, key2_name: 'value2_1', key3: 2, key3_name: 'value3_2', count: 2}, 
{key1: 1, key1_name: 'value1_1', key2: 2, key2_name: 'value2_2', key3: 1, key3_name: 'value3_1', count: 1}, 
{key1: 1, key1_name: 'value1_1', key2: 2, key2_name: 'value2_2', key3: 2, key3_name: 'value3_2', count: 6}, 
] 

любая помощь будет оценить. Благодаря

ответ

0

Вы можете попробовать это:

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]] 

печати (data1)

[{'count': 3, 'key2': 1, 'key1': 1, 'key2_name': 'value2_1', 'key1_name': 'value1_1'}, 
      {'count': 15, 'key2': 1, 'key1': 2, 'key2_name': 'value2_1', 'key1_name': 'value1_2'}, 
      {'count': 12, 'key2': 1, 'key1': 3, 'key2_name': 'value2_1', 'key1_name': 'value1_3'}, 
      {'count': 13, 'key2': 2, 'key1': 1, 'key2_name': 'value2_2', 'key1_name': 'value1_1'}, 
      {'count': 8, 'key2': 2, 'key1': 2, 'key2_name': 'value2_2', 'key1_name': 'value1_2'}] 

[EDIT 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]] 
+0

но как добавить "недостающее" row ({key1: 3, key1_name: 'value1_3', key2: 2, key2_name: 'value2_2', count: 0},), а также вы видели мою Note3? потому что этот код не будет работать, если data1 и данные имеют 3 ключа –

+0

Для отсутствующей строки вы хотите count = 0, что это? –

+0

не уверен, что вы имели в виду, строка «messing» должна быть: ({key1: 3, key1_name: 'value1_3', key2: 2, key2_name: 'value2_2', count: 0},) Как я писал в предыдущий комментарий –

Смежные вопросы