【问题标题】:"Unsupported operand type(s) for ^: 'str' and 'str'" with Binary in Python 3.x“^ 不支持的操作数类型:'str' 和 'str'”在 Python 3.x 中使用二进制
【发布时间】:2017-05-25 01:56:30
【问题描述】:

我目前正在做一个关于二元运算符的项目。现在我有两个列表,其中包含 8 位 1 和 0 的字符串系列。假设我有这段代码(表示我创建两个数组时产生的内容):

arr1 = ['0b01110101', '0b00001111', '0b01001101']
arr2 = ['0b10010100', '0b00000101', '0b00111001']
arr3 = []

我想运行一个循环,对每个值执行 XOR 二元运算符。到目前为止,这是我的循环:

for i in len(arr1):
    arr3[i] = arr1[i] ^ arr2[i]

当我运行此代码时,我收到以下错误消息:

Unsupported operand type(s) for ^: 'str' and 'str'

我试过这样做:

arr3[i] = bin(arr1[i]) ^ bin(arr2[i])

并返回此错误消息:

TypeError: 'str' object cannot be interpreted as an integer

我该如何解决这个问题?

编辑 1:这不是它在 cmets 中被标记的内容的副本。我不是在寻找如何执行正常的 XOR 二进制函数。我知道该怎么做。我正在寻找一种将这些字符串转换为二进制数的方法,以便我可以对它们使用 XOR 运算符。

【问题讨论】:

  • 将它们转换为整数。 int('0b00111001', 2) == 57。所有位运算符都适用于整数。
  • 您是否阅读了这两个答案,看看它是否有助于回答您的问题:herehere
  • 如果你“取消引用”列表(arr1,arr2...)应该可以工作。

标签: python string integer binary-operators


【解决方案1】:

您可以取消引用列表

arr1 = ['0b01110101', '0b00001111', '0b01001101']
arr2 = ['0b10010100', '0b00000101', '0b00111001']
arr3 = []

并且还修复了循环上的错误并使用appendrange 进行迭代。

for i in range(len(arr1)):       # xrange for Pyhon2
    arr3.append(int(arr1[i], 2) ^ int(arr2[i], 2))

【讨论】:

  • 我实际上无法取消引用列表。从我使用循环生成它们的方式来看,它们显示在列表中并带有引号。
  • 按照 Jean-François Fabre 所说的进行转换并修复循环,无论如何都会修改答案以适应这个新要求。
【解决方案2】:

试试这个:

arr1 = ['0b01110101', '0b00001111', '0b01001101']
arr2 = ['0b10010100', '0b00000101', '0b00111001']
arr3 = []

for i, _ in enumerate(arr1):
    xor = int(arr1[i], 2) ^ int(arr2[i], 2)
    arr3.append("0b{0:08b}".format(xor))

输出:

['0b11100001', '0b00001010', '0b01110100']

【讨论】:

  • 考虑压缩列表以避免索引访问:for a1,a2 in zip(arr1,arr2):。否则很好。
【解决方案3】:

bin 是整数的字符串表示形式。你不能对字符串进行异或。

只做一个整数转换,以2为底,转换理解整数,有0b或没有它:

for a1,a2 in zip(arr1,arr2):
    print(bin(int(a1,2) ^ int(a2,2)))

结果:

0b11100001
0b1010
0b1110100

【讨论】:

  • 您能解释一下这是如何工作的吗?比如为什么第二个显示为只有 4 位而不是完整的 8 位?
  • 那是因为格式和小数字大小。正如另一个答案所述,"0b{0:08b}" 是添加零的格式。
猜你喜欢
  • 2017-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-20
  • 2018-12-06
相关资源
最近更新 更多