弹出并附加到新列表在python中不起作用

弹出并附加到新列表在python中不起作用,python,append,Python,Append,我的目标是获得两个不同列表(keyNum和stringNum)的同一索引中的值进行相加,并将总和放入一个新的单独列表(encNum)。但是,当我运行代码时,它并没有完全贯穿整个列表。 代码如下: def encrypt(key, string): letters = 'abcdefghijklmnopqrstuvwxyz' keyNum = [] stringNum = [] encNum = [] for symbol in key: n

我的目标是获得两个不同列表(keyNum和stringNum)的同一索引中的值进行相加,并将总和放入一个新的单独列表(encNum)。但是,当我运行代码时,它并没有完全贯穿整个列表。 代码如下:

def encrypt(key, string):
    letters = 'abcdefghijklmnopqrstuvwxyz'
    keyNum = []
    stringNum = []
    encNum = []
    for symbol in key:
        numKey = letters.find(symbol)
        keyNum.append(numKey)
    for symbol in string:
        numString = letters.find(symbol)
        stringNum.append(numString)
    for element in stringNum:
        a = keyNum.pop(0)
        b = stringNum.pop(0)
        c = a + b
        encNum.append(c)
        print keyNum
        print stringNum
        print encNum

您描述的跳过项问题是由于从
stringNum
弹出,同时在第三个for循环中对其进行迭代。在该循环的第一次迭代中,
element=stringNum[0]
然后在同一循环中从列表中弹出该项。因此,在下一次迭代中,
element=stringNum[1]
,但是,由于原始列表中的第一项已被删除,
element
实际上等于原始列表中的
stringNum[2]
,然后才开始循环

下面的代码段是一个示例,说明了当您从列表的左侧弹出时,同时对列表进行迭代时会发生什么:

>>> some_list = [1, 2, 3, 4, 5, 6, 7]
>>> for item in some_list:
...     print('Iterated item: {}'.format(item))
...     print('Popped item:   {}'.format(some_list.pop(0)))
...
Iterated item: 1
Popped item:   1
Iterated item: 3
Popped item:   2
Iterated item: 5
Popped item:   3
Iterated item: 7
Popped item:   4
如果
key
string
都是相同的长度,就像您的方法描述所暗示的那样,那么对于第三个循环,您将使用类似的方法,这比在重复相同列表时从左侧弹出更合适:

for keyVal, strVal in zip(numKey, numString):
    encNum.append(keyVal + strVal)
或者您甚至可以将所有三个循环合并为一个:

for keyX, strX in zip(key, string):
    keyVal = letters.find(keyX)
    strVal = letters.find(strX)
    encNum.append(keyVal + strVal)

但是,如果
len(key)!=len(string)
,您的重新实现将需要更多的思考。

您甚至没有在这里使用
元素
,那么为什么首先要循环使用
stringNum
的元素呢?如果您想这样做,只需在stringNum:时执行
循环,直到弹出所有内容。但更好的解决方案是首先不要弹出。只需一个接一个地使用这些元素,然后,如果您真的想清空最后的列表,您可以一次删除所有元素,或者删除整个列表。代码更少,更难出错,速度更快。