2013-10-21 64 views
2

我是新来的Python编程...我想在这里做2块之间的XOR是我的代码XOR两个蟒蛇块

def XorBlock(block1, block2): 
    l = len(block1); 
    if (l != len(block2)): 
     raise ValueError, "XorBlock arguments must be same length" 
    return [(block1[j]+block2[j]) % 2 for j in xrange(l)]; 

,但是当我把它给了我

TypeError: not all arguments converted during string formatting 

所以请人帮我哪里是错误在这个code..thanks提前

+0

确保两个列表的元素都是数字,而不是字符串。 – georg

+0

当我把它整数它给了我这个TypeError:'sage.rings.integer.Integer'类型的对象有没有len() –

回答

0

也许这是你在找什么:

def XorBlock(block1, block2): 
    l = len(block1) 
    if l != len(block2): 
     raise ValueError 
    #   |-> Converting into int 
    return [(int(block1[j])+int(block2[j])) % 2 for j in xrange(l)] 
    #      |-> Converting into int 


if __name__ == '__main__': 
    print XorBlock("12345", "23456") 

>>> XorBlock("010101", "108734") 
[1, 1, 0, 0, 1, 1] 

我决定保持两个参数为字符串将是最好的,因为在二进制,你可能有任何有价值的数字之前有一些0秒。

+0

可以请告诉我如果__name__ =='__main__':意思是? –

+0

@ranatamer那么,它就像C++中的'main'函数。基本上,如果python运行当前文件,那么文件的__name__变成'__main__'。在这个例子中,你真的不需要使用它,你可以输入'XorBlock(“12345”,“23456”)',它会工作得很好。 –

+0

@ranatamer看看[这个](http://stackoverflow.com/questions/419163/what-does-if-name-main-do)。它比我更好地解释它。 –

0

这部分是错误的,我们来看一看:

(block1[j]+block2[j]) % 2 

两个项目都是字符串,因此,其结果是一个字符串。简而言之,python将你的%2作为字符串格式化命令。

"string"%something 

将期望字符串指定它应该格式化的位置something。如果没有指定任何内容,则会提高当前TypeError。你可能需要的是这样的:

return[(int(block1[j])+int(block2[j])) % 2 for j in xrange(l)] 
#This converts it to integers, then xor it. 

希望这有助于!