在Python中根据条件从现有列表创建新列表

0 投票
4 回答
1155 浏览
提问于 2025-04-17 07:22

我正在尝试从一个列表中删除一些项目,

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()了。

希望这能给你一些启发。

撰写回答