弹出并附加到新列表在python中不起作用
我的目标是获得两个不同列表(keyNum和stringNum)的同一索引中的值进行相加,并将总和放入一个新的单独列表(encNum)。但是,当我运行代码时,它并没有完全贯穿整个列表。 代码如下:弹出并附加到新列表在python中不起作用,python,append,Python,Append,我的目标是获得两个不同列表(keyNum和stringNum)的同一索引中的值进行相加,并将总和放入一个新的单独列表(encNum)。但是,当我运行代码时,它并没有完全贯穿整个列表。 代码如下: def encrypt(key, string): letters = 'abcdefghijklmnopqrstuvwxyz' keyNum = [] stringNum = [] encNum = [] for symbol in key: n
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:时执行循环,直到弹出所有内容。但更好的解决方案是首先不要弹出。只需一个接一个地使用这些元素,然后,如果您真的想清空最后的列表,您可以一次删除所有元素,或者删除整个列表。代码更少,更难出错,速度更快。