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



好吧,我不知道我做错了什么,我希望你们能启发我。

这就是挑战:

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

00 00 00 00 00 00 0 -> 1001

2-将得到的二进制字符串转换成整数

1001 -> 9

输入样例:

程序应该接受一个文件名的路径作为它的第一个参数。每一行输入都包含一个从0开始的字符串。例如

00 00 00 00 00 00 00 0

00 0

00 0000000 000000 000000 000000 000

0 000000000 000000

输出示例:

对于来自input的每一行,打印一个表示0的整数基于数字。例如

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",当它需要时。

谁知道我做错了什么?

提前感谢!

如果num为偶数,则不增加num。另外,不要在每行的开头重置它。

与其显式地这样做,不如使用enumerate来保持计数器:

for num, i in enunerate(test.strip().split(" ")):
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)

这个做数学运算而不是字符串操作;应该占用更少的内存和更快一点。

# 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))

这是我的函数式解决方案:

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
第一步:tokenize
>>> tok = "00 0 0 000 00 0000000 0 000".split()
>>> print tok
['00', '0', '0', '000', '00', '0000000', '0', '000']

第二步:构建flag和value的元组

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

第三步:有条件地将输入转换为'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'

第五步:将字符串转换为以2为基数的整数

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

相关内容

  • 没有找到相关文章

最新更新