当我们在while循环中给出两个比较运算符时,python如何理解?

ers*_*ski 2 python python-3.x

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)
Run Code Online (Sandbox Code Playgroud)

该代码有效,输出为:

[(1, 6), (2, 7), (3, 8), (4, 9), (5, 10)]
Run Code Online (Sandbox Code Playgroud)

然而,我只是想知道当我们在 while 循环中给出两个更大/更小的选项时 Python 是如何工作的。在上面的例子中,我已经定义了i<5i<6,但是它在内部是如何工作的,程序如何理解i<5属于list1i<6属于list2?当我改变了while循环while i<6:,我得到IndexError: list index out of range

joj*_*ojo 5

请允许我做一个小更正你的说法:Python不明白,i<5应该只属于list1i<6list2

事实上,正在发生的事情如下:

  • i在编写时定义了一个变量i=0
  • while i<5 and i<6:你结合两个比较操作:
    1. i小于5
    2. 是(相同)i小于6
  • while循环内您使用单个变量i作为两个指数list1list2那你增加i1

当只写while i<6:发生的事情是 fori=5循环仍然运行并且您的代码尝试获取list1[5]哪个不存在,list1大小为 5,因此最后一个元素使用list1[4]. 如果您只是list1[5]在控制台中输入,您将得到一个IndexError,与i<5从您的while-condition 中删除 时得到的错误完全相同。


如果你想几个列表合并成一个列表,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)]
Run Code Online (Sandbox Code Playgroud)

如您所见,list2使用zip. 有了zip_longest,但是,它仍然存在与“失踪”元素从list1完成用None

希望这有助于澄清一些事情。