如何检查字符串中的每个字母并执行一些操作,在Python中

时间:2016-09-01 20:06:22

标签: python string

所以我在python中乱搞,并且出现了问题。 我从一个字符串开始,如下所示:

a = "1523467aa252aaa98a892a8198aa818a18238aa82938a"

对于每个数字,您必须将其添加到sum变量。此外,每次遇到一个字母时,索引迭代器必须向后移动2.我的程序在isinstance()处不断崩溃。这是我到目前为止的代码:

def sum():
    a = '93752aaa746a27a1754aa90a93aaaaa238a44a75aa08750912738a8461a8759383aa328a4a4935903a6a55503605350'
    z = 0
    for i in a:
        if isinstance(a[i], int):
            z = z + a[i]
        elif isinstance(a[i], str):
            a = a[:i] + a[(i+1):]
            i = i - 2
            continue
     print z
     return z
sum()

2 个答案:

答案 0 :(得分:1)

这部分没有按你的想法行事:

for i in a:
    if isinstance(a[i], int):

由于i是一个迭代器,因此不需要使用a[i],它会混淆Python。

此外,由于a是一个字符串,因此它的任何元素都不是int,它们都是string。你想要这样的东西:

for i in a:
    if i.isdigit():
        z += int(i)

编辑: 在迭代迭代时删除迭代元素是一个常见的问题,我建议创建一个只包含你要保留的元素的新字符串:

z = 0
b = ''
for i in a:
    if i.isdigit():
        z += int(i)
        b += str(i)

a = b    # set a back to b so the "original string" is set to a string with all non-numeric characters removed.

答案 1 :(得分:0)

您的代码存在一些问题。你好像不明白for... in循环是如何工作的,但@Will已经在他的答案中解决了这个问题。此外,您对isinstance()的工作方式存在误解。由于数字是字符串的字符,当您遍历该字符串时,每个字符也将是(一个长度)字符串。无论是否可以将isinstance(a[i], int)转换为intint都会失败。你真正想要做的只是尝试将每个角色转换为ValueError并将其添加到总数中。如果它工作,那很好,如果不是只是抓住异常并继续前进。您不必担心非数字字符,因为当每个字符引发string = '93752aaa746a27a1754aa90a93aaaaa238a44a75aa08750912738a8461a8759383aa328a4a4935903a6a55503605350' def sum_(string): total = 0 for c in string: try: total += int(c) except ValueError: pass return total sum_(string) 时,它将被忽略,并且字符串中的下一个字符将被处理。

sum(int(c) for c in string if c.isdigit())

此外,此功能相当于以下单行:

sum(map(int, filter(str.isdigit, string)))

或功能风格......

wikipedia