Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pythonic列表迭代_Python_Django_Iteration - Fatal编程技术网

Pythonic列表迭代

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的神奇之处,感觉好像有

我有一个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的神奇之处,感觉好像有某种内置函数可以为您实现这一点。然而,我浏览了
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
更好。从操作标识元素(empty
QuerySet
)开始,完全避免循环体中的条件是最好的。