我有一个需要删除某些元素的数组。我试图让列表理解为我做这个,但它不起作用。
这是一个二维数组。对于数组中的每一行,如果第一个项目str符合两个限定条件,我希望将其删除。但是,当我使用"和"声明它只看第一个声明。为什么会这样,你如何纠正它?
act_array = [row for row in act_array if row[0][-4:] != '0660' and row[0][0] != '4' ]
所以我这个例子我想要复制所有不以4开头而且最后4个字符不等于0660的项目
由于
答案 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
(注意,否定是分配的,并且or
和if 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']]