【问题标题】:XOR two blocks in python在python中对两个块进行异或
【发布时间】:2013-10-29 15:15:51
【问题描述】:

我是 python 编程的新手...我想在 2 个块之间进行 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

所以请任何人帮助我这段代码中的错误在哪里..提前谢谢

【问题讨论】:

  • 确保两个列表的元素都是数字,而不是字符串。
  • 当我把它设为整数时,它给了我这个 TypeError: object of type 'sage.rings.integer.Integer' has no len()

标签: python sage


【解决方案1】:

也许这就是你要找的东西:

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]

我认为最好将两个参数都保留为字符串,因为在二进制中,您可能必须在任何数字值之前有一些 0s。

【讨论】:

  • 你能告诉我如果 name == 'main': 意味着什么??
  • @ranatamer 好吧,它就像 C++ 中的 main 函数。基本上,如果python正在运行当前文件,那么文件的__name__就变成__main__。在这个例子中,你真的不需要使用它,你只需输入XorBlock("12345", "23456"),它就可以正常工作了。
  • @ranatamer 看看this。它比我解释得更好。
【解决方案2】:

这部分错了,看一下:

(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.

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-07
    • 1970-01-01
    • 2020-10-19
    • 1970-01-01
    • 2013-06-27
    • 2021-12-04
    • 1970-01-01
    • 2012-07-09
    相关资源
    最近更新 更多