我坦率地不明白如何使用iter(o[,sentinel])
函数,我试图遍历lst
(列表)并打印所有值,直到{ {1}}
代码:
'kdawg'
我希望它能够回归:
lst = [2,3,4,'kdawg',5,6,'hey']
class foo:
def __str__(self):
return str(lst)
for i in iter(foo,'kdawg'):
print i
然而,它会连续返回整个列表:
2
3
4
为什么我的[2,3,4,'kdawg',5,6,'hey']
功能不起作用?
答案 0 :(得分:6)
>>> from itertools import takewhile
>>>
>>> l = [2,3,4,'kdawg',5,6,'hey']
>>>
>>> for i in takewhile(lambda s: s != 'kdawg', l):
... print i
...
2
3
4
答案 1 :(得分:4)
如果您想使用functools.partial
执行此操作,请使用iter
:
>>> from functools import partial
for i in iter(partial(next, iter(lst)), 'kdawg'):
print i
...
2
3
4
iter
期望你传递一个逐个返回值的callable,你的情况就是这个类和对该类的调用每次返回一个新实例,它不等于传递给{的sentinel值{1}}。
iter
在您的代码中,>>> p = partial(next, iter(lst))
>>> p()
2
>>> p()
3
>>> p()
4
>>> p()
'kdawg'
始终是i
的实例:
class
<强>输出:强>
for i in iter(foo,'kdawg'):
print repr(i)
答案 2 :(得分:2)
从开始切片到lst.index('kdawg')
>>> lst = [2,3,4,'kdawg',5,6,'hey']
>>> for i in lst[:lst.index('kdawg')]:
... print i
2
3
4
注意:如果在列表中找不到该项,则许多人想要处理ValueError
:
def iterUpto(a, ele):
'''
If ele is in a return sublist from 0 to index(ele) otherwise return a
'''
if ele in a: return a[:a.index(ele)]
return a
列表中包含ele
:
>>> a = [2,3,4,'kdawg',5,6,'hey']
>>> for i in iterUpto(a, 'kdawg'):
... print i
2
3
4
ele
不在列表中:
>>> for i in iterUpto(a, 'foo'):
... print i
2
3
4
kdawg
5
6
hey
答案 3 :(得分:0)
第四种选择:
for i in lst:
if i == 'kdawg':
break
print i
或者如果您需要制作新的清单:
new_lst = []
for i in lst:
if i == 'kdawg':
break
new.append(i)
或者不是制作新的列表,而是生成函数!
def not_kdawg:
for i in lst:
if i == 'kdawg':
break
yield i