列表解析python中的“和”语句

时间:2014-04-24 18:13:45

标签: python arrays list-comprehension

我有一个需要删除某些元素的数组。我试图让列表理解为我做这个,但它不起作用。

这是一个二维数组。对于数组中的每一行,如果第一个项目str符合两个限定条件,我希望将其删除。但是,当我使用"和"声明它只看第一个声明。为什么会这样,你如何纠正它?

act_array = [row for row in act_array if row[0][-4:] != '0660' and row[0][0] != '4' ]

所以我这个例子我想要复制所有不以4开头而且最后4个字符不等于0660的项目

由于

2 个答案:

答案 0 :(得分:3)

  

...如果第一项,即str,符合两项资格,我希望将其删除......

因此,您希望所有以0660结尾的行以及以4开头的所有行,但不包含同时包含if row[0][-4:] != '0660' and row[0][0] != '4' ] # ^ ^^^ ^ 的所有行。

你有一个逻辑错误,你的情况

if not (row[0][-4:] == '0660' or row[0][0] == '4') ]
#  ^^^              ^^        ^^           ^^
根据德莫根定律,

在逻辑上等同于:

and

(注意,否定是分配的,并且orif row[0][-4:] != '0660' or row[0][0] != '4' ] # ^ ^^ ^ 被交换。这意味着您过滤满足任一条件的元素。修复它其中之一:

if not (row[0][-4:] == '0660' and row[0][0] == '4') ]
#  ^^^              ^^        ^^^           ^^

{{1}}

答案 1 :(得分:1)

似乎按预期工作:

In [6]: act_array=[['4X0660'], ['4X1111'], ['1X0660'], ['1X1111']]
In [7]: [row for row in act_array if row[0][-4:] != '0660' and row[0][0] != '4' ]
Out[7]: [['1X1111']]