list1 = [1,2,3,4,5]
list2 = [6,7,8,9,10,11]
new_list = list()
i = 0
while i<5 and i<6:
new_list.append((list1[i],list2[i]))
i += 1
print(new_list)
代码有效,输出为:
[(1, 6), (2, 7), (3, 8), (4, 9), (5, 10)]
但是,我只是想知道当我们在 while 循环中给出两个更大/更小的选项时,Python 是如何工作的。在上面的例子中,我定义了 i<5
和i<6
,但是它内部是如何工作的以及程序如何理解i<5
属于list1
和i<6
属于list2
?当我将 while 循环更改为 while i<6:
时我得到IndexError: list index out of range
.
最佳答案
请允许我对您的说法做一点修正:
Python 不理解 i<5
应该只属于list1
和i<6
至list2
。
事实上发生的事情如下:
- 您定义一个变量
i
写作时i=0
- 在
while i<5 and i<6:
您结合两个比较操作:- 是
i
小于5
- 是(相同)
i
小于6
- 是
- 在 while 循环中使用单个变量
i
作为list1
的索引和list2
然后你增加i
通过1
.
仅写入时while i<6:
发生的情况是 i=5
循环仍在运行,您的代码尝试获取 list1[5]
不存在,如 list1
大小为 5,因此使用 list1[4]
访问最后一个元素。如果您只需输入 list1[5]
在控制台中您将得到 IndexError
,与删除 i<5
时出现的错误完全相同来自您的while
-条件。
如果你想将多个列表组合成一个列表,Python 有一个内置函数: zip()
如果像您的情况一样,列表的大小不同,并且您不想丢失任何元素,那么在这种情况下,python 也会为您提供 zip_longest()
。方法来自 itertools模块。
这是这样的:
list1 = [1,2,3,4,5]
list2 = [6,7,8,9,10,11]
new_list = [*zip(list1,list2)] # or list(zip(list1,list2))
print(new_list)
>>> [(1, 6), (2, 7), (3, 8), (4, 9), (5, 10)]
# without loosing elements:
from itertools import zip_longest
new_list = [*zip_longest(list1,list2)]
print(new_list)
>>> [(1, 6), (2, 7), (3, 8), (4, 9), (5, 10), (None, 11)]
如您所见, list2
的最后一个元素使用 zip
时我们丢失了。
与zip_longest
,但是,它仍然存在,并且 list1
中的“丢失”元素已完成 None
.
希望这有助于澄清一些事情。
关于python - 当我们在 while 循环中给出两个比较运算符时,python 如何理解?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61353574/