合并python中的两个列表 - 但在合并期间对它们进行排序

时间:2014-03-06 01:19:44

标签: python django

我从两个模型中查询:

fq = MyModel.objects.order_by('-added_time')
sq = MySecondModel.objects.order_by('-added_time')

说,查询集是:

1_1, 1_2, 1_3
2_1, 2_2, 2_3

我想:

1_1, 2_1, 1_2, 2_2, 1_3, 2_3

我尝试的是:

all_res = list(fq) + list(sq)

但它正在提供1_1, 1_2, 1_3, 2_1, 2_2, 2_3

我该怎么做才能达到我的目的?我使用的是paginator,因此结果也应该是一个查询集。

修改

这就是我现在正在做的事情:

fq= MyModel.objects.order_by('-added_time')
sq = MySecondModel.objects.order_by('-added_time')
all_res = sorted(chain(fq, sq),key=attrgetter('-added_time'))

我有这种类型的分页,我在页面中设置左右边距。

enter image description here

这个左右距离我设置如下:

min = all_res.number - 5
max = all_res.number + 5

这一行给了我错误:'list' object has no attribute 'number',因为all_res是一个列表。

3 个答案:

答案 0 :(得分:3)

你想对它们进行排序,还是想要交织它们?如果是前者,

all_res = sorted(list(fq) + list(sq), key = lambda x: (x[-1], x[0]))

答案 1 :(得分:1)

您可以使用heapq's merge(合并多个已排序的iterables):

In [11]: a = [1, 4, 6]

In [12]: b = [2, 3, 7]

In [13]: list(heapq.merge(a, b))
Out[13]: [1, 2, 3, 4, 6, 7]

答案 2 :(得分:0)

现有代码:

fq = MyModel.objects.order_by('-added_time')
sq = MySecondModel.objects.order_by('-added_time')

1_1, 1_2, 1_3
2_1, 2_2, 2_3

你想:

1_1, 2_1, 1_2, 2_2, 1_3, 2_3

如果您知道所需的顺序是fq [n],sq [n],fq [n + 1] ......等,那么解决方案非常简单。如果您不确定对象是否会以该模式出现(缺少数据?),那么我建议将列表和排序组合起来。

answer = [f for s in zip(fq, sq) for f in s]