Pythonic列表迭代
我有一个Django查询集列表,我想将其合并到一个查询中。合并两个查询集的标准方法是执行以下操作:Pythonic列表迭代,python,django,iteration,Python,Django,Iteration,我有一个Django查询集列表,我想将其合并到一个查询中。合并两个查询集的标准方法是执行以下操作:newQ=Q1 | Q2,我希望对列表中的所有元素执行该操作以形成一个查询集对象 使用for循环很容易做到这一点,例如: for qs in qs_list: if final_qs not in locals(): final_qs = qs else: final_qs = final_qs | qs 考虑到python的神奇之处,感觉好像有
newQ=Q1 | Q2
,我希望对列表中的所有元素执行该操作以形成一个查询集对象
使用for循环很容易做到这一点,例如:
for qs in qs_list:
if final_qs not in locals():
final_qs = qs
else:
final_qs = final_qs | qs
考虑到python的神奇之处,感觉好像有某种内置函数可以为您实现这一点。然而,我浏览了itertools
库,没有任何东西可以简化此操作
所以我的问题是,有没有一种更类似于python的方法来执行上述操作?是的,调用该函数。将其用于:
reduce()
获取qs_list
的第一个to值,将这些值传递给第一个参数operator.或
,有效地执行qs_list[0]| qs_list[1]
。然后,它接受该结果,加上qs_list
中的下一个值,并再次应用第一个参数,依此类推,直到qs_list
完成
对于包含4个元素的qs_列表
,可归结为:
or_(or_(or_(qs_list[0], qs_list[1]), qs_list[2]), qs_list[3])
或相当于:
qs_list[0] | qs_list[1] | qs_list[2] | qs_list[3]
但是reduce适用于qs_list
>0的任何长度(对于长度为1的列表,返回第一个值而不应用第一个参数)
请注意,如果final_qs not in locals()的使用非常不和谐;永远不要那样做。您可以使用qs\u列表[0]
中的初始final\u qs
编写循环:
final_qs = qs_list[0]
for qs in qs_list[1:]:
final_qs |= qs
是的,该函数被调用。将其用于:
reduce()
获取qs_list
的第一个to值,将这些值传递给第一个参数operator.或
,有效地执行qs_list[0]| qs_list[1]
。然后,它接受该结果,加上qs_list
中的下一个值,并再次应用第一个参数,依此类推,直到qs_list
完成
对于包含4个元素的qs_列表
,可归结为:
or_(or_(or_(qs_list[0], qs_list[1]), qs_list[2]), qs_list[3])
或相当于:
qs_list[0] | qs_list[1] | qs_list[2] | qs_list[3]
但是reduce适用于qs_list
>0的任何长度(对于长度为1的列表,返回第一个值而不应用第一个参数)
请注意,如果final_qs not in locals()的使用非常不和谐;永远不要那样做。您可以使用qs\u列表[0]
中的初始final\u qs
编写循环:
final_qs = qs_list[0]
for qs in qs_list[1:]:
final_qs |= qs
Martijn的答案中已经给出了规范的Python方式,但这一
final\u qs而不是locals()
技巧(您可能指的是引用标识符'final\u qs'
)让我不寒而栗。如果出现空的qs_列表
,将导致未绑定的本地最终
,并带来灾难性后果。在循环之前显式指定“还没有值”值,例如None
更好。从一个操作标识元素(空的QuerySet
)开始,完全避免循环体中的条件是最好的。Martijn的答案中已经给出了规范的Python方法,但是这final_qs不是在locals()中(
技巧(你可能指的是引用标识符'final_qs'
)让我不寒而栗。如果出现空的qs_列表
,将导致未绑定的本地最终
,并带来灾难性后果。在循环之前显式指定“还没有值”值,例如None
更好。从操作标识元素(emptyQuerySet
)开始,完全避免循环体中的条件是最好的。