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

标签 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)

代码有效,输出为:

[(1, 6), (2, 7), (3, 8), (4, 9), (5, 10)]

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

最佳答案

请允许我对您的说法做一点修正: Python 不理解 i<5应该只属于list1i<6list2

事实上发生的事情如下:

  • 您定义一个变量 i写作时i=0
  • while i<5 and i<6:您结合两个比较操作:
    1. i小于5
    2. 是(相同)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/

相关文章:

python-3.x - 为什么生成的 SVG 图像不如相应的 PNG 图像丰富

python - python中的Alexa请求验证

python - 正则表达式提取数字维度

python - 如何使用 Flask WTF 获取 QuerySelectField 当前值

python - 使用哪个索引来访问 defaultdict 中的项目

python - 在 sklearn 的双标图中绘制 PCA 加载和加载(类似于 R 的自动绘图)

python - 模块 'socket' 没有属性 'getsockname'

python - 尝试从 nytimes.com 下载 .pdf .png 和 .jpg

python - 使用 MethodType 将方法从一个实例动态添加到另一个实例

python - 用 0 填充和对齐向量