我有以下列表:
str_list = [1,3,"foo bar",10]
我想要做的就是简单地遍历它 打印结果。如果迭代符合“foo bar”,则停止。
我尝试了以下代码:
In [6]: for x in str_list:
...: print x
...: if x is "foo bar":
...: break
...:
继续在“foo bar”之后打印字符串。 它不符合我的预期,即只打印这个:
1
3
这样做的正确方法是什么?
答案 0 :(得分:2)
您只需在检查后打印即可。如果它是你在支票中寻找的字符串,那就休息吧。像这样:
>>> str_list = [1,3,"foo bar",10]
>>> for item in str_list:
... if item == 'foo bar':
... break
... print item
...
1
3
此外,请务必注意使用is
和使用==
之间的区别。如此answer中所述,is
检查两个变量是否指向同一个对象。 ==
检查变量引用的对象是否相等。所以你应该在这里使用==
。
答案 1 :(得分:2)
itertools.takewhile是专门为此目的编写的,虽然我不是特别的粉丝,因为它通过lambda添加了一个不必要的函数调用,而且通常难以调试
>>> from itertools import takewhile
>>> for elem in takewhile(lambda e: e != "foo bar", str_list):
print elem
1
3
答案 2 :(得分:1)
在检查所需的字符串后,您需要打印列表中的项目。
for x in str_list:
if x == "foo bar":
break
print(x)
然而,有更多的pythonic方法:
try:
foo_idx = str_list.index('foo bar')
except ValueError:
print(str_list)
else:
print(str_list[:foo_idx])
如果您希望这样可以返回您在问题中显示的格式:
try:
foo_idx = str_list.index('foo bar')
except ValueError:
print('\n'.join(map(str, str_list)))
else:
print('\n'.join(map(str, str_list[:foo_idx])))
答案 3 :(得分:0)
最简单的方法是使用您想要的值进行拆分......
我们说你有清单
s = [1,3,"foo bar",10]
然后,
s[:s.index('foo bar')]
是一个列表,直到'foo bar'
的位置。当然,如果' foo bar'不在列表中,然后它会抛出一个错误。然后,您可以将上面的行更改为
s[:s.index('foo bar')] if 'foo bar' in s else s
答案 4 :(得分:0)
str_list = [1,3,"foo bar",10]
for x in str_list:
if x is "foo bar":
break
print x