好的,所以我不知道我做错了什么,希望你们有人能开导我。
这是挑战:
- 使用以下规则将基于零的数字转换为二进制形式:a)标志“0”表示以下零序列应该 被附加到二进制字符串。 b)标志“00”表示以下内容 应将零序列转换为1和1的序列 附加到二进制字符串。
醇>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”。
任何人都可以弄清楚我做错了什么?
提前致谢!
答案 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))