好吧,我不知道我做错了什么,我希望你们能启发我。
这就是挑战:
- 使用以下规则将基于零的数转换为二进制形式: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
瞧