我目前正在研究一个问题,该问题会遍历任何字符串,并根据某些给定规则将特定数字解析为新列表。
示例字符串:
'800!)176^b006$(46$*#63Z*16$*06$z5^'
预期产量:
[ 800, 600, 64, 63, 61, 60]
解析数字的规则为:
数字是非负整数,例如123
每个数字的第一个字符始终是一个数字。
如果$
字符在数字后立即出现,则其数字倒退。211$
112也是如此。
如果^
在数字后立即出现一个字符,则表示该数字不存在于数据中,并且从输出中将其省略。因此,例如176^
将被省略。
这些数字是由随机字符哪些不是彼此分离^
或$
或数字。
我已经开始了问题,并找到了一些测试用例。
我的代码中存在3个核心问题:
关于规则3:我的代码可以识别$
字符串中的,并将向后遍历它,这将使我的测试用例成功。但是,仅当字符串没有过去时$
。我不确定如何让它只对它之前的字符串执行然后继续。
关于规则4:我只是不确定如何在开始之前省略整个字符串部分^
最后一个是获取代码以根据规则执行这些操作,然后将它们正确地附加到列表中。意思是我不知道如何让它以给定字符串中的一系列子字符串的形式执行所有操作。
def parse_line(s):
"""
Given a string s, parse the ints out of it and
return them as a list of int values.
>>> parse_line('12$35$')
[21, 53]
"""
search = 0
lst_num = []
if len(s) > 1:
while True:
start = search
while start < len(s) and not s[start].isdigit():
start += 1
if start >= len(s):
break
end = start + 1
while end < len(s) and s[end].isdigit():
end += 1
if end < len(s) and not s[end].isdigit():
if s[end] == '$':
rev_case = reverse(s)
lst_num.append(rev_case)
if s[end] == '^':
continue
end += 1
search = end + 1
return lst_num
lst_num.append(int(s))
return lst_num
我希望代码仅以相反的顺序返回数字列表:
parse_line('12$35$')
[21, 53]
我收到失败的消息错误:
ValueError: invalid literal for int() with base 10: '53$21'
您可以一次遍历字符串,一次遍历一个元素。如果字符是数字,则可以将其保存到临时列表中。击中非数字后,您可以根据自己的规则检查是否有特殊字符。如果字符是a$
并且您在临时列表中有一个数字,请反转该数字,然后将其保存到结果中。如果字符是^
,则重置您的临时列表。如果字符是其他字符,并且您的临时列表中有一个数字,则将该数字添加到结果中。
重要的是您一次只能处理一个字符,而不必在字符串中来回移动。
def parse_lines(s):
result = [] # Will be returned
cur_num = "" # A string of the characters from the current number
for char in s:
if char.isdigit():
cur_num += char
elif char == "$" and cur_num:
result.append(int(cur_num[::-1])) # Then reverse it
cur_num = "" # and reset cur_num
elif char == "^": # no need to check cur_num.. we reset it anyway.
cur_num = "" # Then reset cur_num
elif not char.isdigit() and cur_num:
result.append(int(cur_num))
cur_num = ""
if cur_num: # Handles if a number is at the end of the input string
result.append(int(cur_num))
return result
test_cases = ["800!)176^b006$(46$*#63Z*16$*06$z5^", "12$35$", "", "$", "^", "5"]
for test in test_cases:
print(f"{test}: {parse_lines(test)}")
输出:
800!)176^b006$(46$*#63Z*16$*06$z5^: [800, 600, 64, 63, 61, 60]
12$35$: [21, 53]
: []
$: []
^: []
5: [5]
注:在现实世界中,我更愿意使用regex
作为splash58的回答农具非常好,但您的评论指出,这是一个任务,并且regex
是可能不允许的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句