python检查列表中的字符串?

tij*_*jko 2 python list

我试图遍历列表检查列表中的每个字符串的字符.

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)


kin*_*all 5

你有两个问题.首先,if总是采用这种说法.

if '0' or '4' or '6' or '8' in str(i):
Run Code Online (Sandbox Code Playgroud)

因为字符串0是非零长度的字符串,因此True.0或者40,因此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)