我正在尝试为我编写的密码制作一个转换器,它需要能够并排检查2个列表,但是我的程序不会返回任何输出。
def encrypt(message, key):
for i in range(len(message)):
ans = ""
char = message[i]
if(char == 1):
for j in range(len(key)):
if(key[j] == 1):
ans = 'a'
if(key[j] == 0):
ans = 'c'
if(char == 0):
for j in range(len(key)):
if(key[j] == 1):
ans = 'd'
if(key[j] == 0):
ans = 'b'
return ans
print(encrypt(str(1010), str(1100)))
我希望它输出“ adcb”。我认为将return语句放在哪里存在问题?我不知道。
答案 0 :(得分:0)
您似乎想循环两个长度相等的字符串,只包含字符'0'
和'1'
,并且如果两个都相等,则想返回一个包含'a'
的长度相等的字符串该位置上的字符是'1'
作为输入等。
所以,像这样:
def encrypt(message, key):
code = {('1', '1'): 'a', ('1', '0'): 'c', ('0', '1'): 'd', ('0', '0'): 'b'}
return ''.join(
code[(m, k)] for m, k in zip(message, key)
)
print(encrypt('1010', '1100'))
结果:
adcb
并使用循环和索引(不是很pythonic)提供您尝试使用的“固定”版本:
def encrypt(message, key):
ans = ''
for i in range(len(message)):
m = message[i]
k = key[i]
if m == '1':
if k == '1':
ans += 'a'
if k == '0':
ans += 'c'
if m == '0':
if k == '1':
ans += 'd'
if k == '0':
ans += 'b'
return ans
请注意,我已经删除了多余的括号和产生错误结果的多余循环。
您可以进一步简化:
def encrypt(message, key):
ans = ''
for i in range(len(message)):
if message[i] == '1':
if key[i] == '1':
ans += 'a'
else:
ans += 'c'
else:
if key[i] == '1':
ans += 'd'
else:
ans += 'b'
return ans
然后从那里:
def encrypt(message, key):
ans = ''
for m, k in zip(message, key):
if m == '1':
if k == '1':
ans += 'a'
else:
ans += 'c'
else:
if k == '1':
ans += 'd'
else:
ans += 'b'
return ans
作为额外的好处,这是一个粗糙的单线,超出了Pythonic的范围:
def encrypt(message, key):
return ''.join('bdca'[int(m)*2 + int(k)] for m, k in zip(message, key))
答案 1 :(得分:0)
问题出在条件语句char == 1
和char == 0
上。由于字符串和整数是两种不同的数据类型,因此条件语句的值为False
,并且内部for循环永远不会运行,因此该函数不返回任何输出。要解决此问题,请将其更改为char == '1'
和char == '0'
。相同的规则适用于key [j] == 1和key [j] == 0,因为key是作为字符串传递给函数的。