无法使用列表解析从元组列表中删除元组

时间:2016-11-03 16:54:37

标签: python list tuples

我有一个元组列表,我想从这个列表中删除一个元素。我不想使用remove()方法,因为列表不是唯一的,我想删除与给定元组匹配的所有元素。

那么,为什么下面的代码不会删除(21, 187)元素?

edgeList = [(1, 2), (3, 75), (21, 187), (2, 6)]
edgeList = [(e1, e2) for e1, e2 in edgeList if (e1 != 21 & e2 != 187)]
print(edgeList)

上面的代码将打印:

[(1, 2), (3, 75), (21, 187), (2, 6)]

为什么元组(21, 187)仍在那里?

3 个答案:

答案 0 :(得分:4)

您正在使用位运算符&,您想使用and

edgeList = [(e1,e2) for e1,e2 in edgeList if (e1!=21 and e2!=187)]

问题是&的优先级与and的优先级不同,因此您最终会执行e1 != (21 & e2) != 187

答案 1 :(得分:4)

Francisco's answer正确地指出您的问题出现是因为比较(例如!=)的优先级低于按位布尔运算符(例如&),但优先级高于逻辑布尔运算符(例如and)。您也可以通过执行类似

的操作来完全避免此问题
[e for e in edgeList if e != (21, 187)]

python中的元组比较相等,如果它们的所有元素都相等。

答案 2 :(得分:1)

如果将每个不等式检查括在括号中,则可以使用&edgeList = [(e1,e2) for e1,e2 in edgeList if ((e1!=21) & (e2!=187))]