[英]How to compare items in two lists and create a new list out of results?
作為練習,我正在嘗試編寫一個簡單的 XOR 解密。
我想采用 ASCII 的二進制輸入並將其存儲在列表中。 然后取一個二進制密鑰並將其存儲在列表中。
函數應該分別比較兩個列表中的項目,並檢查正在比較的兩個項目是 0 還是 1。如果都是 0 或都是 1,則輸出 item = 0。如果一個項目是 0,另一個是 1,反之亦然,則輸出項 = 1。
對於函數執行的每次比較,它應該將輸出二進制項存儲在result
列表中。 一旦函數迭代了兩個列表中的每個項目,它應該打印result
的結果二進制輸出。
我的邏輯:
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()
我的例子不起作用。 比較 binary_plaintext 列表和 binary_key 列表並迭代它們的項目以便輸出值可以存儲在新列表中的正確方法是什么?
基本上,您可以通過添加兩個輸入然后模 2 來實現 XOR。
例如,這將工作:
result = [(x+y) % 2 for x,y in zip(binary_plaintext,binary_key)]
print(result)
[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
,盡管你反復將它附加到output
,當我認為你有倒退時(即附加output
到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]
您的函數中有幾個錯誤 - 首先,要並行迭代列表,您可以使用zip()
- 所以我們可以替換
for plaintext_item in binary_plaintext and key_item in binary_key:
和
for plaintext_item, key_item in zip(binary_plaintext, binary_key):
其次,你需要使用
result.append(output)
代替
output.append(result)
最后,取消縮進print(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 執行此操作。
import numpy as np
x = np.asarray([0,0,1,1])
y = np.asarray([0,1,0,1])
xor = x ^ y
在您自己的實現中,使用zip
從兩個列表中獲取匹配對。 您還錯誤地交換了輸出和結果:
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, key_item in zip(binary_plaintext, binary_key):
if plaintext_item == 1 and key_item == 1: # XOR 1|1 = 0
output = 0
result.append(output)
elif plaintext_item == 0 and key_item == 0: # XOR 0|0 = 0
output = 0
result.append(output)
elif plaintext_item == 1 and key_item == 0: # XOR 1|0 = 1
output = 1
result.append(output)
elif plaintext_item == 0 and key_item == 1: # XOR 0|1 = 1
output = 1
result.append(output)
print(result)
xor()
我們可以使用 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]
我們將 binary_plaintext 和 binary_key 壓縮在一起,並對列表理解中每個元組的內容進行異或。
這假設 binary_plaintext 和 binary_key 的長度相同。
您可以使用壓縮包。 我正在使用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()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.