[英]Merging two lists of dictionaries to create a third one in python
假設我有以下內容:
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''},
]
您可以為 2 個輸入列表中的每一個構建一個dict
,如下所示:
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)
我最終做了以下事情(在看到兩個新答案之前):
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)
它看起來非常接近最近的答案,但我不知道這樣做的最佳方法是什么
您可以通過以下方式在幾行代碼中獲得您想要的結果:
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'}]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.