从字符串中提取数字时出现重复数字

2024-10-03 02:35:25 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有以下字符串:

A12B2C6

我想提取一个向量的数字和另一个向量的字符,这样输出是:

['12', '2', '6']
['A', 'B', 'C']

我尝试使用以下代码执行此操作:

string = input()
digits = []
characters = []
for c in range(len(string)-1):
    if string[c].isdigit():
        if string[c].isdigit() and string[c + 1].isdigit():
            digits.append(string[c] + string[c + 1])
        else:
            digits.append(string[c])
    else:
        characters.append(string[c])

print(digits)
print(characters)

但出口是:

['12', '2', '2']
['A', 'B', 'C']

Tags: 字符串inputstringif数字字符向量else
3条回答

类似于这样的东西可以从您的代码中工作:

text = input()
digits = []
characters = []
for char in text:
    if char.isdigit() and not char in digits:
        digits.append(char)
    elif not char.isdigit() and not char in characters:
        characters.append(char)
print(digits)
print(characters)

还可以使用set()删除重复项

您的代码有两个问题:

  1. 您可以处理两次两位数的数字。当c == 1您追加12时,当c == 2您追加2时。它不是真的复制数字;这只是巧合,在B之后的2与在12之后的A中的2是相同的
  2. for c in range(len(string)-1):表示从不处理字符串中的最后一个字符;这就是为什么结果中没有6。它应该是range(len(string)),但是您需要专门处理c == len(string)-1,这样您就不会试图使用string[c+1]

您可以通过使用while循环而不是for来解决第一个问题,因此在处理2位数字时可以将c增加两次

但使用正则表达式更简单:

import re

digits = re.findall(r'\d+', string)
characters = re.findall(r'\D', string)

其他人已经指出了这个问题,但这里是一个应该产生正确结果的实现

编辑:我假设反对票来自那些喜欢正则表达式解决方案的人。正则表达式的解决方案很好,但OP可能也有兴趣看到一些与他们的尝试相同的东西

string = input()

digits = []
characters = []
current_digit = ""

for c in string:
    if c.isdigit():
        current_digit += c
    else:
        # Non-digits signal the end of the current digit
        if current_digit:
            digits.append(current_digit)
            current_digit = ""
        
        characters.append(c)

# May need to "flush" the current digit if at end of string
if current_digit:
    digits.append(current_digit)

print(digits)
print(characters)

相关问题 更多 >