Python迭代器行为

时间:2012-01-28 11:21:16

标签: python iterator generator

给定一个任意输入字符串,我想找到该字符串中所有数字的总和。 这显然要求我在迭代它时知道字符串中的NEXT元素......并决定它是否为整数。如果前一个元素也是一个整数,则这两个元素形成一个新的整数,所有其他字符都被忽略,等等。

例如输入字符串

ab123r.t5689yhu8 

应该得到123 + 5689 + 8 = 5820的总和。

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

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

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

4 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:3)

可以使用itertools.groupby

完成此操作
from itertools import groupby

s = 'ab123r#t5689yhu8'
tot = 0
for k, g in groupby(s, str.isdigit):
    if k:
        tot += int(''.join(g))

或在一行(如下面的评论中所示)

tot = sum((int(''.join(g)) for k, g in groupby(s, str.isdigit) if k)

答案 2 :(得分:2)

编辑:我首先删除了这个答案,因为在这个帖子中有更好的解决方案来解决你的问题,但是因为你直接询问如何使用下一个方法让代码正常工作我已经恢复了它,如果你发现它有用。

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

def sort_by_type():
    maininput = iter("acdre2345ty")

    for char in maininput:
        if char.isalpha():
            print char
        elif char.isdigit():
            number = char
            while True:
                # try/except could take care of the StopIteration exception 
                # when a digit is last in the string
                #
                # try:
                #    char = maininput.next()
                # except StopIteration:
                #    char = ""
                #
                # however using next(iterator, default) is much better:
                #
                char = next(maininput, "")

                if char.isdigit():
                    number += char
                else:
                    break
            print number
            print char

如果产生:

a
c
d
r
e
2345
t
y

答案 3 :(得分:1)

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

eval(''.join([['+0+',x][x.isdigit()]for x in s]))