0

我有以下两个来自 Django 的 ValueQuerySet。

dict1 = [{'user': 1, 'total_bookmarked': 2}, {'user': 2, 'total_bookmarked': 3}]

dict2 = [{'user': 1, 'name': 'Joe'}, {'user': 2, 'name': 'Paula'}]

如何合并两个 ValueQuerySet 以便获得以下信息:

dict3 = [{'user': 1, 'name': 'Joe', 'total_bookmarked':2}, {'user': 2, 'name': 'Paula', 'total_bookmarked': 3}]

我该怎么做?我曾考虑将这些转换回 Python 字典列表,但我不确定如何处理它,即使它有效。

4

2 回答 2

2

我首先建议您尝试查看是否可以在一个查询中获得此信息,因为它更有效。但是,如果您想用第二个列表更新第一个列表,并且它们的顺序相同:

list1 = [{'user': 1, 'total_bookmarked': 2}, {'user': 2, 'total_bookmarked': 3}]
list2 = [{'user': 1, 'name': 'Joe'}, {'user': 2, 'name': 'Paula'}]

for a,b in zip(list1, list2):
    a.update(b)

如果它们是非常大的列表,您可以通过使用进一步提高效率izip

from itertools import izip

for a,b in izip(list1, list2):
    a.update(b)

如果由于某种原因它们都没有按用户排序:

from operator import itemgetter

list1.sort(key=itemgetter('user'))
list2.sort(key=itemgetter('user'))

我会避免使用嵌套 for 循环的解决方案,因为它不会那么有效。

于 2012-05-16T19:59:40.530 回答
0

如果它们只是无序列表或字典,那将是

list1 = [{'user': 1, 'total_bookmarked': 2}, {'user': 2, 'total_bookmarked': 3}]
list2 = [{'user': 1, 'name': 'Joe'}, {'user': 2, 'name': 'Paula'}]
list3 = []
for d1 in list1:
    for d2 in list2: 
        if d1['user'] == d2['user']:
            d3 = dict(d1.items()+d2.items()
            list3.append(d3)
            break
        else:
            continue

如果您的列表是由用户订购的,那么有一个更好的方法

list1 = [{'user': 1, 'total_bookmarked': 2}, {'user': 2, 'total_bookmarked': 3}]
list2 = [{'user': 1, 'name': 'Joe'}, {'user': 2, 'name': 'Paula'}]

list3 = [dict(d1.items()+d2.items()) for (d1, d2) in zip(list1,list2)]   
于 2012-05-16T19:50:18.613 回答