如何使用另一个值QuerySet更新Value QuerySet?

时间:2012-05-16 19:39:11

标签: python django

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

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的词典列表,但我不确定如何处理它,即使它有效。

2 个答案:

答案 0 :(得分: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循环的解决方案,因为它不会那么有效。

答案 1 :(得分: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)]