Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python迭代器行为_Python_Iterator_Generator - Fatal编程技术网

Python迭代器行为

Python迭代器行为,python,iterator,generator,Python,Iterator,Generator,给定一个任意的输入字符串,我要找到该字符串中所有数字的总和。 这显然需要我在遍历字符串时知道它的下一个元素…并决定它是否为整数。如果前一个元素也是整数,则这两个元素将形成一个新的整数,并忽略所有其他字符,依此类推 例如,输入字符串 ab123r.t5689yhu8 acdre2345ty 结果应为123+5689+8=5820 所有这些都是在不使用正则表达式的情况下完成的 我在python中实现了一个迭代器,我认为它的(next())方法返回下一个元素,但传递输入字符串 ab123r.t

给定一个任意的输入字符串,我要找到该字符串中所有数字的总和。 这显然需要我在遍历字符串时知道它的下一个元素…并决定它是否为整数。如果前一个元素也是整数,则这两个元素将形成一个新的整数,并忽略所有其他字符,依此类推

例如,输入字符串

ab123r.t5689yhu8 
acdre2345ty 
结果应为
123+5689+8=5820

所有这些都是在不使用正则表达式的情况下完成的

我在python中实现了一个迭代器,我认为它的(next())方法返回下一个元素,但传递输入字符串

ab123r.t5689yhu8 
acdre2345ty 
我得到以下输出

a
c
d
r
e
2
4
t
y
有些数字3和5不见了…这是为什么?我需要
next()
来帮助我筛选输入字符串并正确地进行计算

更好的是,我应该如何实现下一个方法,以便它在给定的迭代过程中将元素产生到最右边

这是我的密码

class Inputiterator(object):
    '''
    a simple iterator to yield all elements from a given
    string successively from  a given input string
    '''
    def __init__(self, data):
        self.data = data
        self.index = 0

    def __iter__(self):
        return self

    def next(self):
        """
        check whether we've reached the end of the input
        string, if not continue returning the current value
        """
        if self.index == len(self.data)-1:
            raise StopIteration
        self.index = self.index + 1
        return self.data[self.index]

# Create a method to get the input from the user
# simply return a string

def get_input_as_string():
    input=raw_input("Please enter an arbitrary string of numbers")
    return input

def sort_by_type():
    maininput= Inputiterator(get_input_as_string())
    list=[]
    s=""
    for char in maininput:
        if str(char).isalpha():
            print ""+ str(char)
        elif str(char).isdigit() and str(maininput.next()).isdigit():
            print ""+ str(char)

sort_by_type()

Python字符串已经是可编辑的,无需创建自己的迭代器

因此,无需迭代器即可实现您想要的:

s = "acdre2345ty2390"

total = 0
num = 0

for c in s:
    if c.isdigit():
        num = num * 10 + int(c)
    else:
        total += num
        num = 0

total += num
其结果是:

>>> print total
4735
这可以通过以下方式实现:

或者在一行中(如下面的注释所示):


编辑:我首先删除了这个答案,因为在这个线程中有更好的解决方案,但是当您直接询问如何使用下一个方法使代码工作时,我已经恢复了它,以防您发现它有用

试试这个(为了方便起见,我模仿了迭代器):

如果生产:

a
c
d
r
e
2345
t
y

仅用于娱乐目的(我无法抗拒,49个角色):


嗯。。。无法抗拒:
tot=sum((int(''.join(g))表示群比中的k,g(s,lambda c:c.isdigit())如果k))
这里实际上不需要lambda:
tot=sum((int('.join(g))表示群比中的k,g(s,str.isdigit)如果k)
@lvc:谢谢!更新了答案。用
maininput=iter(“acdre2345ty2390”)
char=next(maininput“”)
而不是
char=maininput.next()
会解决的。谢谢,我做了很久。我更喜欢你的解决方案。+1我认为这个答案与OP想要的最接近,尽管allready提供了更优雅的解决方案。谢谢!!我实际上是在寻找这种类型的解决方案。非常优雅的解决方案..谢谢!!!。这就是我决定开始用python编程的原因。呵呵:
import re;eval(re.sub('\D+','+',s))
,37!但是OP说他不想要正则表达式:-(
a
c
d
r
e
2345
t
y
eval(''.join([['+0+',x][x.isdigit()]for x in s]))