我有一个元组列表,我想从这个列表中删除一个元素。我不想使用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)
仍在那里?
答案 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))]