3

坦率地说,我不明白如何使用该iter(o[,sentinel])函数,我正在尝试遍历lst(列表)并打印所有值,直到'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']

为什么我的iter()功能不起作用?

4

4 回答 4

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
于 2013-11-01T14:05:49.103 回答
4

如果functools.partial您想这样做,请使用iter

>>> from functools import partial
for i in iter(partial(next, iter(lst)), 'kdawg'):
        print i
...     
2
3
4

iter期望您传递一个一个一个返回值的可调用对象,即您的情况是该类并且对该类的调用每次都会返回一个新实例,该实例不等于传递给iter.

>>> p = partial(next, iter(lst))
>>> p()
2
>>> p()
3
>>> p()
4
>>> p()
'kdawg'

在您的代码中,i始终是 that 的一个实例class

for i in iter(foo,'kdawg'):
    print repr(i)

输出:

<__main__.foo instance at 0xa15286c>
<__main__.foo instance at 0xa15284c>
<__main__.foo instance at 0xa15286c>
...
...
于 2013-11-01T14:09:54.947 回答
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
于 2013-11-01T14:07:27.737 回答
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
于 2013-11-01T14:14:03.543 回答