或条件和循环坏使用?

时间:2017-01-15 15:28:27

标签: python

我在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.

无论如何它不起作用......它可能是以错误方式使用的'或'命令?

如何修复我的代码?有什么想法吗?

感谢您的时间!!

6 个答案:

答案 0 :(得分:2)

  

如果其中一个在行[k]中,则代码必须通过并执行下一个代码

If语句应为:

if 2 in list[k] or 0 in list[k]:
    pass
else:
    continue

答案 1 :(得分:1)

通过合并ornot,您会感到困惑。您的代码实际上会与您期望的相反。

这是使用简单的生成器表达式执行此操作的简短方法。

>>> 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]

在某些情况下,如果在组合布尔表达式(andornot)时使用分组括号可能会更清楚。

以下代码与您的原始代码类似,但分组括号使得更容易推断表达式。

>>> 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]]中的每个嵌套列表是否包含20,如果是这种情况,请执行某项操作。

您可以通过循环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))

如前所述,检查迭代是否包含特定值的语法分别为innot in,而不是is inis 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

这更短,也更有效。