python中的代码挑战无法正常工作

时间:2014-07-23 22:35:51

标签: python python-2.7 python-3.x

好的,所以我不知道我做错了什么,希望你们有人能开导我。

这是挑战:

  
      
  1. 使用以下规则将基于零的数字转换为二进制形式:a)标志“0”表示以下零序列应该   被附加到二进制字符串。 b)标志“00”表示以下内容   应将零序列转换为1和1的序列   附加到二进制字符串。
  2.         

    00 0 0 00 00 0 - > 1001

         

    2-将获得的二进制字符串转换为整数。

         

    1001 - > 9

         

    输入样本:

         

    您的程序应该接受文件名路径作为其第一个参数。   每行输入包含一个基于零的数字字符串。 E.g。

         

    00 0 0 00 00 0

         

    00 0

         

    00 0 0 000 00 0000000 0 000

         

    0 000000000 00 00

         

    输出样本:

         

    对于输入中的每一行,打印零的整数表示   基数。 E.g。

         

    9

         

    1

         

    9208

         

    3

这是我的代码:

import sys

def StringToBinary(flag,zero):
    val=str()
    if flag=="0":
        for i in zero:
            val+="0"
    elif flag=="00":
        for i in zero:
            val+="1" 
    return (val)

binary=str()
num=1
flag=""
zero=""
test_cases = open(sys.argv[1], 'r')
for test in test_cases:
    for i in test.strip().split(" "):
        if num%2!=0:
            flag=i
            num+=1
        elif num%2==0:
            zero=i
            binary+=StringToBinary(flag,zero)
    print(int(binary, 2))
    binary=""


test_cases.close()

我的输出总是0,我不明白为什么如果我在需要的时候在函数中赋值“1”。

任何人都可以弄清楚我做错了什么?

提前致谢!

4 个答案:

答案 0 :(得分:0)

s = "00 0 0 00 00 0".split()
translate = lambda (flag,zeros):zeros if flag=="0" else zeros.replace("0","1")
decoded_bin = map(translate,zip(s[::2],s[1::2]))
print int("".join(decoded_bin),2)

可能就是我如何解决这个问题......

答案 1 :(得分:0)

如果是偶数,你不会增加num。另外,你不能在每一行的开头重置它。

不要明确地这样做,而是使用enumerate来保持你的柜台更好:

for num, i in enunerate(test.strip().split(" ")):

答案 2 :(得分:0)

以下是我的功能样式解决方案:

tok = "00 0 0 000 00 0000000 0 000".split()
i = int(''.join( map( lambda x: len(x[1]) * '1' if x[0] == '00' else x[1],
                 zip(tok[0::2], tok[1::2]))),
        base=2)
print i == 9208

第一步:标记化

>>> tok = "00 0 0 000 00 0000000 0 000".split()
>>> print tok
['00', '0', '0', '000', '00', '0000000', '0', '000']

第二步:构建标志和值的元组

>>> x = zip(tok[0::2], tok[1::2])
>>> print x
[('00', '0'), ('0', '000'), ('00', '0000000'), ('0', '000')]

第3步:有条件地将输入转换为'0'或'1'的序列

>>> x = map( lambda x: len(x[1]) * '1' if x[0] == '00' else x[1], x )
>>> print x
['1', '000', '1111111', '000']

第4步:将列表加入字符串

>>> x = ''.join(x)
>>> print x
'10001111111000'

第5步:将字符串转换为带基数为2的整数

>>> int(x, base=2)
9208

<强>瞧

答案 3 :(得分:0)

这个是数学而不是字符串操作;应该占用更少的内存并且速度更快。

# assumes Python 3

def pairs(iterable):
    # "abcdef" => ("a","b"), ("c","d"), ("e","f")
    it = iter(iterable)
    return zip(it, it)

def decode(s):
    value = 0
    for flag,zeros in pairs(s.split()):
        shift = len(zeros)
        if flag == "0":
            value <<= shift
        else:
            value = ((value + 1) << shift) - 1
    return value

with open(sys.argv[1]) as inf:
    for line in inf:
        print(decode(line))