【问题标题】:How can I keep my iterable value in Python?如何在 Python 中保持我的可迭代值?
【发布时间】:2015-09-23 08:01:56
【问题描述】:

我有一个函数可以从给定的字符串中识别和分离单词和数字,但是,我的 iterable(i) 没有跳过它应该跳过的地方,而且我得到了多余的结果:

SPACES = [' ', '\n', '\t', '\v', '\f', '\r']
OPERATORS = "%*/+-!^="
DIGITS = '0123456789'
LETTERS = '_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
PARENTHESIS = '()'
return_list = []
test=''
for i in range(len(list_a)):
    print(i)
    if i in SPACES:
        print('space')
    elif list_a[i] in OPERATORS:
        return_list.append(list_a[i])
    elif list_a[i] in DIGITS or list_a[i] == POINT:
        while list_a[i] in DIGITS or list_a[i] == POINT:
            test=test+list_a[i]
            i+=1
        return_list.append(test)
        test=''
        continue
    elif list_a[i] in LETTERS:
        while list_a[i] in LETTERS or list_a[i] in DIGITS:
            test = test+list_a[i]
            i+=1
        return_list.append(test)
        test=''
        continue
    elif list_a[i] in PARENTHESIS:
        return_list.append(list_a[i])
return return_list

对于一个字符串abcde 123 (,我得到这个返回:

['abcde', 'bcde', 'cde', 'de', 'e', '123', '23', '3', '(']

我怎样才能得到:

['abcde', '123','(']

【问题讨论】:

  • i 是一个整数,即你的计数器,而不是一个可迭代的。顺便说一句,要获得['abcde', '123','('],您可以使用list_a.split(),假设list_a 是一个字符串
  • 也许你应该给出完整的代码,包括SPACESOPERATORS等。
  • 我不能使用 split() 因为不是所有的元素都是分开的...
  • OK 然后使用正则表达式,不要重新发明轮子(除非是为了培训目的)
  • 您可以将 split() 与任何字符一起使用:'1.2 + 5'.split('.') 返回 ['1', '2 + 5']

标签: python loops iterator


【解决方案1】:

while 循环中对 i 的更新不会影响 for 循环中的 i 值。 for 循环在 [0,1,2,...] 上迭代 i。在第二次迭代开始时,无论 i 是什么值,它都会被设置回 for 循环中预定义的第二个值(即 1)。等等。 尝试用 while 循环替换第一个 for 循环。

【讨论】:

    【解决方案2】:

    另一种方法是设置一个上下文变量,该变量记录“光标”(即循环在文本字符串中的位置)当前是否在一个单词、一个数字内,或者两者都不是。如果在一个单词或数字中,下一个字符将添加到列表中的前一个项目,而不是作为新项目附加。

    def parse_text(text):
        context = None
        r = []
        for ch in text:
            if ((context == 'number' and ch in DIGITS + POINT) or
                (context == 'word' and ch in LETTERS + DIGITS)):
                r[-1] += ch
                continue
            if ch in OPERATORS + PARENTHESIS + DIGITS + LETTERS:
                r.append(ch)
            context = None
            if ch in DIGITS:
                context = 'number'
            elif ch in LETTERS:
                context = 'word'
        return r
    

    【讨论】:

      猜你喜欢
      • 2021-09-15
      • 1970-01-01
      • 2019-09-06
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 2019-07-05
      • 1970-01-01
      相关资源
      最近更新 更多