让我们解开这一点。
没有内置的方法来对两个元组进行元素明智的or
(逻辑或按位)。 Morgan Thrapp的回答显示了编写自己的一个好方法,所以如果您想在for循环中保持运行状态,那就是我的方式。生成器表达式很容易被熟悉Python的人理解 - 尽管如果我实际上不需要按位版本,我会使用tuple(a or b for a, b in zip(result, new_result))
而不是a | b
。
Numpy数组有一个logical_or
函数可以按元素进行工作,但如果您只有适量的布尔值元组,那么这将会严重矫枉过正。
保持运行状态的替代方法是收集所有结果元组并从结果元组列表中计算最终的布尔值元组。如果你要提前终止循环(比如说,如果你的积累结果元组的所有元素都是True),或者你的循环有足够的迭代来保证内存使用很重要,这将是不合适的。然而,根据你的口味,它可能更清晰。这与保持数值的运行总数相比,只是在循环运行和汇总后收集值时是相同的决定,如果您将for循环重新设置为结果元组的迭代器的实例,将是我的首选方法。
这看起来是这样的:
result_list = []
for j in some_list:
result_list.append(method(j))
result = tuple(any(grouped) for grouped in zip(*result_list))
上星扩张的结果列表将组zip
所有的第一/第二你的元组是正长度元组的列表/第三值,其中n是多少的结果,并且any
有效地or
它们在一起。EG:在布尔
>>> result_list = [(False, True, False), (True, False, False), (False, False, False), (True, True, False)]
>>> zip(*result_list)
[(False, True, False, True), (True, False, False, True), (False, False, False, False)]
>>> tuple(any(grouped) for grouped in zip(*result_list))
(True, True, False)
由于or
相当于又多了数字和any
相当于sum
,你可以考虑用整数同类机型。 for循环/多重分配版本:
sums = (0, 0, 0)
for j in some_list:
result = method(j)
sums[0] += result[0]
sums[1] += result[1]
sums[2] += result[2]
VS发电机表达运行总和版本:
sums = (0, 0, 0)
for j in some_list:
result = method(j)
sums = (a + b for a, b in zip(sums, result))
VS累积和相加结果的列表:
result_list = []
for j in some_list:
result_list.append(method(j))
sums = tuple(sum(grouped) for grouped in zip(*result_list))
这个版本是特别如果您的for
循环没有任何其他主体,那么这很好,因为您可以将整个事件合并到任何级别的生成器表达式/列表推导中:
result_list = [method(j) for j in some_list]
sums = tuple(sum(grouped) for grouped in zip(*result_list))
或:
sums = tuple(sum(grouped) for grouped in zip(*(method(j) for j in some_list)))
你有一个特别的原因是使用的'bool's位或操作符? –
@Josh:这就是代码中使用的 - 我应该改变它还是? –
我会这样想的。如果您想了解更多信息,请参阅[Python布尔运算符vs按位运算符](http://stackoverflow.com/q/3845018)。 –