在Python中根据条件从现有列表创建新列表
我正在尝试从一个列表中删除一些项目,
list1 = ["CCC-C", "CCC-P", "CCC-A-P", "CCC-A-H", "CCC-J", "CCC-S-X"]
new_list = [i for i in list1 if (len(i) == 5 or len(i) == 7 or i[6] != "H")]
除非 list1
中的任何项目长度为 5 或 7,或者它的第 7 个字符是 "H",否则它不应该出现在 new_list
中。
但是,上面的代码却把 "CCC-A-H" 这个项目包含在了 new_list
中。此外,当检查项目 "CCC-C" 的 i[6] 时,它也没有给出 "IndexError: string index out of range" 的错误。有什么想法吗?
祝好,
4 个回答
0
另外,当检查字符串 "CCC-C" 的第七个字符 i[6] 时,并不会出现 "IndexError: string index out of range" 的错误。
或
是短路运算。如果在 或
条件中第一个条件为 True
,那么它就不会计算第二个条件,因为无论第二个条件的真假,整体的结果都会是 True
。
还有,"CCC-A-H" 之所以匹配,是因为它的长度是 7。如果你不想要那些在第七个位置以 H 结尾的字符串,不管它们的长度是多少,你需要重新写你的逻辑表达式:
new_list = [i for i in list1 if (len(i) == 5 or len(i) == 7) and (i[6] != "H")]
2
这样做:
new_list = [i for i in list1 if len(i)==5 or (len(i)==7 and i[6]!="H")]
这样一来,你只会得到长度为5的项(条件是 len(i)==5
),或者长度为7的项,但前提是最后一个字符不是 H
(条件是 (len(i)==7 and i[6]!="H")
)。
这个可能会出现 IndexError
的条件 i[6]!="H"
只有在字符串长度为7的时候才会被检查,这样就能确保不会出现这个错误。
2
在Python中,布尔表达式的执行顺序是这样的:
>>> A() or B()
如果A()返回的是True,那么就不需要再检查B()了。
>>> A() and B()
如果A()返回的是False,那也就不需要检查B()了。
希望这能给你一些启发。