Python不接受某些数字输入

时间:2014-07-07 20:19:05

标签: python

使用这段代码,我所要做的就是在偶数之间插入一个短划线和偶数之间的星号。每次输入都无法正常工作。它适用于,例如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()) 

3 个答案:

答案 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())