Объединение двух списков словарей для создания третьего в Python - PullRequest
0 голосов
/ 23 января 2019

Допустим, у меня есть следующее:

list_a = [
    {u'username': u'firstuser', u'userid': u'1'},
    {u'username': u'seconduser', u'userid': u'2'},
    {u'username': u'thirduser', u'userid': u'3'},
]

и этот:

list_b = [
    {u'username': u'firstuser', u'userid': u'101'},
    {u'username': u'seconduser', u'userid': u'102'},
]

Как я могу получить третий такой:

list_result = [
    {u'username': u'firstuser', u'userid_one': u'1', u'userid_two': u'101'},
    {u'username': u'seconduser', u'userid_one': u'2', u'userid_two': u'102'},
    {u'username': u'thirduser', u'userid_one': u'3', u'userid_two': u''},
]

Ответы [ 3 ]

0 голосов
/ 23 января 2019

В нескольких строках кода вы можете добиться желаемого результата следующим образом:

list_a = [
    {u'username': u'firstuser', u'userid': u'1'},
    {u'username': u'seconduser', u'userid': u'2'},
    {u'username': u'thirduser', u'userid': u'3'},
]

list_b = [
    {u'username': u'firstuser', u'userid': u'101'},
    {u'username': u'seconduser', u'userid': u'102'},
]

# Get all users from both lists.
users = set(elem['username'] for elem in list_a + list_b)
# Get all ids for every user from the above list we created.
userids = [{user:[elem['userid'] for elem in list_a + list_b if elem['username']==user]} for user in users]
# Add a padding of a maximum of two elements in order to fill any missing values with ''.
userids = [{key: ids + [''] * (2-len(ids))} for user in userids for key , ids in user.items()]
# Create final list.
list_c = [{'username':key, 'userid_one':values[0], 'userid_two':values[1]} for elem in userids for key, values in elem.items()]
print(list_c)

Окончательный результат:

[{'username': 'seconduser', 'userid_one': '2', 'userid_two': '102'}, {'username': 'thirduser', 'userid_one': '3', 'userid_two': ''}, {'username': 'firstuser', 'userid_one': '1', 'userid_two': '101'}]
0 голосов
/ 24 января 2019

Я закончил тем, что сделал следующее (прежде чем увидел оба новых ответа):

final_list = []

for i in range(0, len(list_a)):
    d = {}
    userid_two = ''
    d['username'] = list_a[i]['username']
    for j in range(0, len(list_b)):
        if d['username'] == list_b[j]['username']:
            userid_two = list_b[j]['userid']
    d['userid_two'] = userid_two
    d['userid_one'] = list_a[i]['userid']
    final_list.append(d)

Это выглядит довольно близко к недавним ответам, но я не знаю, как лучше это сделать

0 голосов
/ 23 января 2019

Вы можете построить dict для каждого из 2 списков ввода, например:

dict_a = {
    e['username']: e['userid']
    for e in list_a}
dict_b = {
    e['username']: e['userid']
    for e in list_b}

Затем построить новый dict, объединяющий данные из обоих:

dict_result = {}

for username, userid in dict_a.items():
    if username not in dict_result:
        dict_result[username] = {}
    dict_result[username]['userid_one'] = userid
for username, userid in dict_b.items():
    if username not in dict_result:
        dict_result[username] = {}
    dict_result[username]['userid_two'] = userid

Это также можно сократить до:

import collections
dict_result = collections.defaultdict(dict)

for label, d in [('one', dict_a), ('two', dict_b)]
    for username, userid in d.items():
        dict_result[username]['userid_{}'.format(label)] = userid

Наконец, если вам действительно нужен конечный результат в виде списка:

list_result = []

for username, d in dict_result.items():
    # 'd' already contains the other data, we just add the 'username'
    d['username'] = username

    list_result.append(d)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...