Python —同时遍历两个列表

时间:2020-11-04 01:28:17

标签: python

我正在尝试为我编写的密码制作一个转换器,它需要能够并排检查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语句放在哪里存在问题?我不知道。

2 个答案:

答案 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 == 1char == 0上。由于字符串和整数是两种不同的数据类型,因此条件语句的值为False,并且内部for循环永远不会运行,因此该函数不返回任何输出。要解决此问题,请将其更改为char == '1'char == '0'。相同的规则适用于key [j] == 1和key [j] == 0,因为key是作为字符串传递给函数的。