2012-05-16 2 views
0

У меня есть два отдельных списка Python, которые имеют общие имена ключей в соответствующем словаре. Второй список под названием recordList имеет несколько словарей с таким же именем, что и я хочу добавить первый список clientList. Вот примеры списков:Комбинируйте словари Python, которые имеют одинаковое имя ключа

clientList = [{'client1': ['c1','f1']}, {'client2': ['c2','f2']}] 
recordList = [{'client1': {'rec_1':['t1','s1']}}, {'client1': {'rec_2':['t2','s2']}}] 

Таким образом, конечный результат будет что-то вроде этого, так что записи, теперь в новом списке многочисленных словарей в рамках clientList.

clientList = [{'client1': [['c1','f1'], [{'rec_1':['t1','s1']},{'rec_2':['t2','s2']}]]}, {'client2': [['c2','f2']]}] 

Кажется достаточно простым, но я изо всех сил, чтобы найти способ итерацию оба этих словарей с помощью переменных, чтобы найти, где они совпадают.

+0

Ваш желаемый результат недействителен. Python ... –

+1

У вас действительно странная структура данных, можете ли вы объяснить еще несколько причин, почему вы используете эти структуры данных? почему список dicts, почему не только один dict? это упростило бы поиск и обновления. –

+0

@ F.C. да, я изменил это, спасибо за комментарий. – wilbev

ответ

3

Если вы уверены, , что ключевые имена одинаковы в обоих словарях:

clientlist = dict([(k, [clientList[k], recordlist[k]]) for k in clientList]) 

как здесь:

>>> a = {1:1,2:2,3:3} 
    >>> b = {1:11,2:12,3:13} 
    >>> c = dict([(k,[a[k],b[k]]) for k in a]) 
    >>> c 
    {1: [1, 11], 2: [2, 12], 3: [3, 13]} 
+0

@Schub спасибо. Это отлично работает и очень просто. – wilbev

+0

. Небольшое улучшение будет заключаться в использовании понимания dict: '{k: [a [k], b [k]] для k в a}' –

1

Предполагая, что вы хотите получить список значений, которые соответствуют каждому ключу в двух списках, попробуйте это как начало:

from pprint import pprint 

clientList = [{'client1': ['c1','f1']}, {'client2': ['c2','f2']}] 
recordList = [{'client1': {'rec_1':['t1','s1']}}, {'client1': {'rec_2':['t2','s2']}}] 
clientList.extend(recordList) 

outputList = {} 

for rec in clientList: 
    k = rec.keys()[0] 
    v = rec.values()[0] 
    if k in outputList: 
     outputList[k].append(v) 
    else: 
     outputList[k] = [v,] 

pprint(outputList) 

Он будет производить это:

{'client1': [['c1', 'f1'], {'rec_1': ['t1', 's1']}, {'rec_2': ['t2', 's2']}], 
'client2': [['c2', 'f2']]} 
1

Это может сработать, но я не уверен, что понимаю правила вашей структуры данных.

# join all the dicts for better lookup and update 
clientDict = {} 
for d in clientList: 
    for k, v in d.items(): 
     clientDict[k] = clientDict.get(k, []) + v 

recordDict = {} 
for d in recordList: 
    for k, v in d.items(): 
     recordDict[k] = recordDict.get(k, []) + [v] 

for k, v in recordDict.items(): 
    clientDict[k] = [clientDict[k]] + v 

# I don't know why you need a list of one-key dicts but here it is 
clientList = [dict([(k, v)]) for k, v in clientDict.items()] 

С данными примера, которые вы предоставили, это дает желаемый результат, надеюсь, что это поможет.

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