我试图遍历列表检查列表中的每个字符串的字符.
test = [str(i) for i in range(100)]
for i in test:
if '0' or '4' or '6' or '8' in str(i):
test.remove(i)
Run Code Online (Sandbox Code Playgroud)
我认为这样会好,但是列表是这样的:
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 75, 77, 79, 81, 83, 85, 87, 89, 91, 93, 95, 97, 99]
Run Code Online (Sandbox Code Playgroud)
删除'2'但是'41'不是?我注意到它只有偶数,但是,不知道为什么.
Sve*_*ach 11
您的代码有两个问题.第一个是你在迭代它时修改列表.第二个是你or以错误的方式使用运算符 - if语句中的条件总是如此True.
这是一个固定版本:
test = [i for i in range(100) if set("0468").isdisjoint(str(i))]
Run Code Online (Sandbox Code Playgroud)
你有两个问题.首先,if总是采用这种说法.
if '0' or '4' or '6' or '8' in str(i):
Run Code Online (Sandbox Code Playgroud)
因为字符串0是非零长度的字符串,因此True.0或者4是0,因此True.声明的其余部分无关紧要.
我希望你真的想测试每个数字是否都在整数的字符串表示中.正如您现在编写的那样,您只是测试是否8在字符串中,并且甚至没有进行测试,因为表达式True在它到达之前就已经计算好了.像这样的东西会起作用:
if any(x in i for x in '0468'):
Run Code Online (Sandbox Code Playgroud)
顺便说一下,str(i)因为你的列表已经是一个字符串列表,这是多余的.
另一个问题是您要从正在迭代的列表中删除项目.那么,这是发生了什么:
0被删除,因为您的if语句总是被删除.1成为第一个项目,因为您已删除0.for环接着的第二个项目,这是现在2.换句话说,因为你删除了0,1从未测试过.因此,每个其他项目(所有偶数)都被删除.
在代码中避免这种情况的最简单方法是迭代列表的副本:
for i in test[:]:
Run Code Online (Sandbox Code Playgroud)