【问题标题】:Python - running on two stringsPython - 在两个字符串上运行
【发布时间】:2012-12-12 20:56:21
【问题描述】:

我正在尝试在一个获取两个参数的函数上组合一个 for 循环。我需要在两个参数上运行(它们都是整数列表)。尝试这个对我不起作用:

def xor_bytes (b, a):
    for i in range (b):
    for Z in range (a):
        if b[i]>a[Z]:
            return byte1
        if b[i]<a[Z]:
            return byte2
        if b[i]==a[Z]:
            return 0

【问题讨论】:

  • 怎么不工作了?它是抛出错误还是给您提供与您想要的不同的输出?
  • for bi, aZ in zip(b, a): if bi &gt; az ...
  • 我猜xor_bytes 的预期输出是一个字节值序列。但是如果你在循环的第一次迭代中返回一个值,你只会得到那个单字节值而没有别的。也许您打算使用 yield expression 而不是 return - 那么您将能够遍历所有字节值。

标签: python python-3.x python-2.7


【解决方案1】:
def xor_bytes (b, a):
    for i,z in zip(b,a):
        if i>z:
            return byte1
        if i<z:
            return byte2
        if i==z:
            return 0
  1. 查看zip 的标准库文档或在终端尝试一下
  2. 案件很重要。我修正了你的大写 zs
  3. 不必使用范围来遍历列表。只需遍历列表即可。
  4. 此代码实际上不会按预期工作,或者根本不会工作,因为您有未定义的变量

请注意,您的代码实际上只会返回一个字节。您可能想将其用作生成器:

def xor_bytes (b, a):
    for i,z in zip(b,a):
        if i>z:
            yield i
        if i<z:
            yield z
        if i==z:
            yield chr(0)


In [6]: list(xor_bytes('hambone', 'cheesey'))
Out[6]: ['h', 'h', 'm', 'e', 's', 'n', 'y']

你可能想要这个:

In [13]: [chr(ord(a)^ord(b)) for a,b in zip('hambone', 'cheesey')]
Out[13]: ['\x0b', '\t', '\x08', '\x07', '\x1c', '\x0b', '\x1c']

如果不是很明显,它接受两个字节字符串并返回一个字节列表(或技术上,长度为 1 字节的字符串),其中包含对每对字节进行异或运算的结果。

或者:

In [14]: ''.join(chr(ord(a)^ord(b)) for a,b in zip('hambone', 'cheesey'))
Out[14]: '\x0b\t\x08\x07\x1c\x0b\x1c'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多