如何使用iter函数循环遍历列表,直到找到某个匹配项

时间:2013-11-01 14:04:02

标签: python python-2.7

我坦率地不明白如何使用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'] 功能不起作用?

4 个答案:

答案 0 :(得分:6)

使用itertools.takewhile()

>>> 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