Python 如何比较两个列表中的项目并根据结果创建新列表?

Python 如何比较两个列表中的项目并根据结果创建新列表?,python,list,xor,Python,List,Xor,作为练习,我尝试编写一个简单的XOR解密程序 我想获取ASCII的二进制输入,并将其存储在列表中。然后获取一个二进制密钥并将其存储在列表中 函数应该分别比较两个列表中的项目,并检查正在比较的两个项目是0还是1。如果两者均为0或均为1,则输出项=0。如果一项为0,另一项为1,反之亦然,则输出项=1 对于函数执行的每个比较,它都应该将输出二进制项存储在结果列表中。一旦函数迭代两个列表中的每个项目,它应该打印结果的结果二进制输出 我的逻辑是: def xor(): binary_plaint

作为练习,我尝试编写一个简单的XOR解密程序

我想获取ASCII的二进制输入,并将其存储在列表中。然后获取一个二进制密钥并将其存储在列表中

函数应该分别比较两个列表中的项目,并检查正在比较的两个项目是0还是1。如果两者均为0或均为1,则输出项=0。如果一项为0,另一项为1,反之亦然,则输出项=1

对于函数执行的每个比较,它都应该将输出二进制项存储在
结果
列表中。一旦函数迭代两个列表中的每个项目,它应该打印
结果的结果二进制输出

我的逻辑是:

def xor():

    binary_plaintext = [1,0,1,0,1,0,0,1, 0,1,0,0,0,1,1,0, 1,1,1,0,0,0,0,1]
    binary_key =       [1,1,1,1,1,0,1,1, 0,0,0,0,1,1,1,1, 1,0,1,1,0,1,0,1]
    result =           []

    for plaintext_item in binary_plaintext and key_item in binary_key:

        if plaintext_item == 1 and key_item == 1: # XOR 1|1 = 0
            output = 0
            output.append(result)

        elif plaintext_item == 0 and key_item == 0: # XOR 0|0 = 0
            output = 0
            output.append(result)

        elif plaintext_item == 1 and key_item == 0: # XOR 1|0 = 1
            output = 1
            output.append(result)

        elif plaintext_item == 0 and key_item == 1: # XOR 0|1 = 1
            output = 1
            output.append(result)

        print(result)

xor()

我的例子不起作用。比较二进制纯文本列表和二进制键列表并迭代它们的项,以便将输出值存储在新列表中的正确方法是什么?

当我认为您有反向操作时,您永远不会更改
结果,尽管您反复将其附加到
输出中(即,将
输出
附加到
结果
)。

当我认为您将
输出
附加到
结果
时,您永远不会更改
结果
,尽管您反复将其附加到
输出
).

基本上,您可以通过两个输入相加,然后模2来实现异或

例如,这将起作用:

result = [(x+y) % 2 for x,y in zip(binary_plaintext,binary_key)]

print(result)
输出
基本上,您可以通过两个输入相加,然后模2来实现异或

例如,这将起作用:

result = [(x+y) % 2 for x,y in zip(binary_plaintext,binary_key)]

print(result)
输出 这将有助于:


result = [int(binary_plaintext[entry]!=binary_key[entry]) for entry in range(len(binary_plaintext))]
# [0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0]
这将有助于:


result = [int(binary_plaintext[entry]!=binary_key[entry]) for entry in range(len(binary_plaintext))]
# [0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0]

函数中有几个错误-首先,要并行迭代列表,可以使用
zip()
-这样我们就可以替换

for plaintext_item in binary_plaintext and key_item in binary_key:

其次,你需要使用

result.append(output)
而不是

output.append(result)
最后,取消输入
打印(结果)
,将其从for循环中取出

然后打印修正后的函数

[0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0]

函数中有几个错误-首先,要并行迭代列表,可以使用
zip()
-这样我们就可以替换

for plaintext_item in binary_plaintext and key_item in binary_key:

其次,你需要使用

result.append(output)
而不是

output.append(result)
最后,取消输入
打印(结果)
,将其从for循环中取出

然后打印修正后的函数

[0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0]

作为参考,您可以使用numpy执行此操作

将numpy导入为np
x=np.asarray([0,0,1,1])
y=np.asarray([0,1,0,1])
xor=x^y
在您自己的实现中,使用
zip
从两个列表中获取匹配对。您还错误地交换了输出和结果:

def xor():
二进制明文=[1,0,1,0,1,0,0,1,0,1,0,0,0,1,1,1,0,1,1,1,0,0,0,0,1]
二进制_键=[1,1,1,1,0,1,1,0,0,0,1,1,1,1,1,1,0,0,1]
结果=[]
对于纯文本\u项,在zip中输入\u项(二进制\u纯文本,二进制\u项):
如果明文_项==1且键_项==1:#XOR 1 | 1=0
输出=0
result.append(输出)
elif纯文本_项==0和键_项==0:#异或0 | 0=0
输出=0
result.append(输出)
elif明文_项==1,键_项==0:#XOR 1 | 0=1
输出=1
result.append(输出)
elif纯文本_项==0和键_项==1:#异或0 | 1=1
输出=1
result.append(输出)
打印(结果)
异或

作为参考,您可以使用numpy执行此操作

将numpy导入为np
x=np.asarray([0,0,1,1])
y=np.asarray([0,1,0,1])
xor=x^y
在您自己的实现中,使用
zip
从两个列表中获取匹配对。您还错误地交换了输出和结果:

def xor():
二进制明文=[1,0,1,0,1,0,0,1,0,1,0,0,0,1,1,1,0,1,1,1,0,0,0,0,1]
二进制_键=[1,1,1,1,0,1,1,0,0,0,1,1,1,1,1,1,0,0,1]
结果=[]
对于纯文本\u项,在zip中输入\u项(二进制\u纯文本,二进制\u项):
如果明文_项==1且键_项==1:#XOR 1 | 1=0
输出=0
result.append(输出)
elif纯文本_项==0和键_项==0:#异或0 | 0=0
输出=0
result.append(输出)
elif明文_项==1,键_项==0:#XOR 1 | 0=1
输出=1
result.append(输出)
elif纯文本_项==0和键_项==1:#异或0 | 1=1
输出=1
result.append(输出)
打印(结果)
异或

我们可以使用python^操作符简单地实现这一点:

def xor():
    binary_plaintext = [1,0,1,0,1,0,0,1, 0,1,0,0,0,1,1,0, 1,1,1,0,0,0,0,1]
    binary_key =       [1,1,1,1,1,0,1,1, 0,0,0,0,1,1,1,1, 1,0,1,1,0,1,0,1]
    return [a ^ b for (a, b) in zip(binary_plaintext, binary_key]
我们将二进制\u明文和二进制\u键压缩在一起,并在列表中对每个元组的内容进行异或运算


这假设二进制明文和二进制密钥的长度相同。

我们可以使用python^运算符来简单地执行此操作:

def xor():
    binary_plaintext = [1,0,1,0,1,0,0,1, 0,1,0,0,0,1,1,0, 1,1,1,0,0,0,0,1]
    binary_key =       [1,1,1,1,1,0,1,1, 0,0,0,0,1,1,1,1, 1,0,1,1,0,1,0,1]
    return [a ^ b for (a, b) in zip(binary_plaintext, binary_key]
我们将二进制\u明文和二进制\u键压缩在一起,并在列表中对每个元组的内容进行异或运算


这假设二进制明文和二进制密钥的长度相同。

您可以使用zip。我使用的是python3

for text,key in  zip(binary_plaintext, binary_key)
   result.append(text ^ key)

你可以用zip,我用的是python3

for text,key in  zip(binary_plaintext, binary_key)
   result.append(text ^ key)

这应该是可行的,编辑代码以获得正确的结果

def xor():

    binary_plaintext = [1,0,1,0,1,0,0,1, 0,1,0,0,0,1,1,0, 1,1,1,0,0,0,0,1]
    binary_key =       [1,1,1,1,1,0,1,1, 0,0,0,0,1,1,1,1, 1,0,1,1,0,1,0,1]
    result =           []

    for i in range(0,len(binary_plaintext)):

        if binary_plaintext[i] == binary_key[i]: # XOR 1|1 = 0 # XOR 0|0 = 0
            output = 0
            result.append(output)

        elif binary_plaintext[i] == 1 and binary_key[i] == 0: # XOR 1|0 = 1
            output = 1
            result.append(output)

        elif binary_plaintext[i] == 0 and binary_key[i] == 1: # XOR 0|1 = 1
            output = 1
            result.append(output)

    print(result)

xor()

这应该是可行的,编辑代码以获得正确的结果

def xor():

    binary_plaintext = [1,0,1,0,1,0,0,1, 0,1,0,0,0,1,1,0, 1,1,1,0,0,0,0,1]
    binary_key =       [1,1,1,1,1,0,1,1, 0,0,0,0,1,1,1,1, 1,0,1,1,0,1,0,1]
    result =           []

    for i in range(0,len(binary_plaintext)):

        if binary_plaintext[i] == binary_key[i]: # XOR 1|1 = 0 # XOR 0|0 = 0
            output = 0
            result.append(output)

        elif binary_plaintext[i] == 1 and binary_key[i] == 0: # XOR 1|0 = 1
            output = 1
            result.append(output)

        elif binary_plaintext[i] == 0 and binary_key[i] == 1: # XOR 0|1 = 1
            output = 1
            result.append(output)

    print(result)

xor()

请提供更多“不起作用”的详细信息。请提供更多“不起作用”的详细信息。完成较小数组时压缩停止。不需要数组具有相同的长度完成较小数组时压缩停止。不需要数组具有相同的长度