使用这段代码,我所要做的就是在偶数之间插入一个短划线和偶数之间的星号。每次输入都无法正常工作。它适用于,例如46879,但是使用468799返回None,或者不使用4546793在4和6之间插入*。为什么这样做?感谢
def DashInsertII(num):
num_str = str(num)
flag_even=False
flag_odd=False
new_str = ''
for i in num_str:
n = int(i)
if n % 2 == 0:
flag_even = True
else:
flag_even = False
if n % 2 != 0:
flag_odd = True
else:
flag_odd = False
new_str = new_str + i
ind = num_str.index(i)
if ind < len(num_str) - 1:
m = int(num_str[ind+1])
if flag_even:
if m % 2 == 0:
new_str = new_str + '*'
else:
if m % 2 != 0:
new_str = new_str + '-'
else:
return new_str
print DashInsertII(raw_input())
答案 0 :(得分:5)
你的功能定义是我在一段时间内看到的最过度构建的功能之一;以下应该做你正在尝试做的事情,没有复杂性。
def DashInsertII(num):
num_str = str(num)
new_str = ''
for i in num_str:
n = int(i)
if n % 2 == 0:
new_str += i + '*'
else:
new_str += i + '-'
return new_str
print DashInsertII(raw_input())
编辑:我只是重新阅读了这个问题,发现我误解了你想要的东西,即在两个偶数之间插入一个-
和两个偶数之间的*
。为此,我能提出的最佳解决方案是使用正则表达式。
第二次编辑:根据alvits的请求,我在此包含了对正则表达式的解释。
import re
def DashInsertII(num):
num_str = str(num)
# r'([02468])([02468])' performs capturing matches on two even numbers
# that are next to each other
# r'\1*\2' is a string consisting of the first match ([02468]) followed
# by an asterisk ('*') and the second match ([02468])
# example input: 48 [A representation of what happens inside re.sub()]
# r'([02468])([02468])' <- 48 = r'( \1 : 4 )( \2 : 8 )'
# r'\1*\2' <- {\1 : 4, \2 : 8} = r'4*8'
num_str = re.sub(r'([02468])([02468])',r'\1*\2',num_str)
# This statement is much like the previous, but it matches on odd pairs
# of numbers
num_str = re.sub(r'([13579])([13579])',r'\1-\2',num_str)
return num_str
print DashInsertII(raw_input())
如果这仍然不是您真正想要的,请对此发表评论告诉我。
答案 1 :(得分:1)
RevanProdigalKnight的回答几乎正确,但是当3个或更多的偶数/奇数聚集在一起时失败。
正则表达式的正确方法是使用正向前瞻(使用?=)。
def insert_right_way(num):
#your code here
num_str = str(num)
num_str = re.sub(r'([13579])(?=[13579])', r'\1-', num_str)
num_str = re.sub(r'([02468])(?=[02468])', r'\1*', num_str)
return num_str
def DashInsertII(num):
num_str = str(num)
num_str = re.sub(r'([02468])([02468])',r'\1*\2',num_str)
num_str = re.sub(r'([13579])([13579])',r'\1-\2',num_str)
return num_str
print insert_right_way(234467776667888)
print DashInsertII(234467776667888)
这将输出:
234*4*67-7-76*6*678*8*8 ( what is desired)
234*467-776*6678*88 ( not what we wanted)
答案 2 :(得分:0)
如果我理解您的问题 - 对于11223344
您需要1-12*23-34*4
def DashInsertII(num):
prev_even = ( int(num[0])%2 == 0 )
result = num[0]
for i in num[1:]:
curr_even = (int(i)%2 == 0)
if prev_even and curr_even:
result += '*'
elif not prev_even and not curr_even:
result += '-'
result += i
prev_even = curr_even
return result
print DashInsertII(raw_input())