我在for循环中设置double if条件时遇到问题。
假设我在上一段代码中添加了一系列列表:
...
...
lines=[[1,1,1],[1,2,1],[1,0,1],[1,1,1]]
我想在for循环中评估2或0在行[k]中,如果其中一个在行[k]中,代码必须通过并执行下一个代码,如果它们不在行[ k]它将继续for循环。我把它编码为:
for k in range(0,4):
if 2 not in list[k] or 0 not in list[k]:
continue
else:
pass
do other analysis
在我看来,这段代码必须像这样工作:
for k=0 ---> lines[0]=[1,1,1] must continue and go to k=1
for k=1 ---> lines[1]=[1,2,1] must pass and do other analysis (2 is in liens)
for k=2 ---> lines[2]=[1,0,1] must pass and do other analysis (0 is in lines)
for k=3 ---> lines[3]=[1,1,1] must continue and finish.
无论如何它不起作用......它可能是以错误方式使用的'或'命令?
如何修复我的代码?有什么想法吗?
感谢您的时间!!
答案 0 :(得分:2)
如果其中一个在行[k]中,则代码必须通过并执行下一个代码
If语句应为:
if 2 in list[k] or 0 in list[k]:
pass
else:
continue
答案 1 :(得分:1)
通过合并or
和not
,您会感到困惑。您的代码实际上会与您期望的相反。
这是使用简单的生成器表达式执行此操作的简短方法。
>>> lines = [[1,1,1],[1,2,1],[1,0,1],[1,1,1]]
>>> for line in (L for L in lines if 0 in L or 2 in L):
... print(line)
[1, 0, 1]
[1, 2, 1]
在某些情况下,如果在组合布尔表达式(and
,or
,not
)时使用分组括号可能会更清楚。
以下代码与您的原始代码类似,但分组括号使得更容易推断表达式。
>>> for line in lines:
... if not ((0 in line) or (2 in line)):
... continue
... print(line)
[1, 0, 1]
[1, 2, 1]
您也可以使用内置filter()
功能来执行此操作。在我看来,这是最易读的解决方案。可读性是避免这些错误的关键。编写额外的功能也使测试和调试变得非常容易。
>>> def contains_0_or_2(line):
... return (0 in line) or (2 in line)
>>> for line in filter(contains_0_or_2, lines):
... print(line)
[1, 0, 1]
[1, 2, 1]
答案 2 :(得分:0)
问题是您使用list[k]
但list
是Python中的内置对象。您想使用lines[k]
,因为您为列表指定了名称lines
。
答案 3 :(得分:0)
如果我正确理解了您的问题,您需要检查lines = [[1,1,1],[1,2,1],[1,0,1],[1,1,1]]
中的每个嵌套列表是否包含2
或0
,如果是这种情况,请执行某项操作。
您可以通过循环lines
内的嵌套列表来执行此操作:
lines = [[1,1,1], [1,2,1], [1,0,1], [1,1,1]]
for sublist in lines:
if 2 in sublist or 0 in sublist:
# Perform operation, e. g.
print('Performing operation on ' + str(sublist))
如前所述,检查迭代是否包含特定值的语法分别为in
或not in
,而不是is in
或is not in
。
答案 4 :(得分:0)
您可以使用集来测试会员资格
test = set([0, 2])
for thing in lines:
if test.isdisjoint(thing):
continue
print(thing)
或
for thing in lines:
if not test.intersection(thing):
continue
print(thing)
答案 5 :(得分:0)
您正在做的是检查数组是否包含任何0 OR,如果它不包含任何2。
这样的数组:[1,2,1]满足条件,因为虽然它确实包含2,但它不包含任何0.你应该写and
而不是or
,但是有一个更好的解决方案:
if 2 in lines[k] or 0 in lines[k]:
# do other analysis
这更短,也更有效。