在 Python 的 for 循环中使用多个变量

Posted

技术标签:

【中文标题】在 Python 的 for 循环中使用多个变量【英文标题】:Using multiple variables in a for loop in Python 【发布时间】:2019-01-26 18:22:21 【问题描述】:

我正在尝试更深入地了解for 如何在 Python 中循环处理不同的数据类型。使用 for 循环迭代数组的最简单方法是

for i in range(len(array)):
    do_something(array[i])

我也知道我可以

for i in array:
    do_something(i)

我想知道这是做什么的

for i, j in range(len(array)):
    # What is i and j here?

for i, j in array:
    # What is i and j in this case?

如果我尝试对dictionaries 或tuples 使用同样的想法会发生什么?

【问题讨论】:

for i, j in range(len(array)) 不起作用 @juanpa.arrivillaga 如果array 是长度为2 的可迭代对象,则第二个示例将起作用。 This 可能有帮助吗? 我认为在 Python 中迭代 list 的最简单方法是完全省略索引:for i in array: do_something(i) 请注意,这通常称为解包,并不限于for 循环。它与显式赋值中使用的机制相同,例如values = 1, 2, 3a, b, c = values 【参考方案1】:

最简单最好的方法是第二种,而不是第一种!

for i in array:
    do_something(i)

永远不要这样做,这会不必要地使代码复杂化:

for i in range(len(array)):
    do_something(array[i])

如果您出于某种原因需要数组中的索引(通常不需要),请改为这样做:

for i, element in enumerate(array):
    print("working with index", i)
    do_something(element)

这只是一个错误,当你试图将一个整数解压成两个名字时,你会得到TypeError: 'int' object is not iterable

for i, j in range(len(array)):
    # What is i and j here?

这可能有效,假设数组是“二维的”:

for i, j in array:
    # What is i and j in this case?

二维数组的一个例子是对的列表:

>>> for i, j in [(0, 1), ('a', 'b')]:
...     print('i:', i, 'j:', j)
...     
i: 0 j: 1
i: a j: b

注意:['these', 'structures'] 在 Python 中被称为列表,而不是数组。

【讨论】:

我想知道自 python3 以来范围问题是否仍然有效(使用迭代器和其他东西)。 是的,它仍然有效。【参考方案2】:

您的第三个循环将不起作用,因为它会为 int 而不是 iterable 抛出 TypeError。这是因为您正在尝试“unpack”作为数组索引的 int 到 ij,这是不可能的。拆包的一个例子是这样的:

tup = (1,2)
a,b = tup

您将a 指定为tuple 中的第一个值,将b 指定为第二个值。当你可能有一个 function 返回一个值的元组并且你想在调用函数时立即解包它们时,这也很有用。喜欢,

train_X, train_Y, validate_X, validate_Y = make_data(data)

我相信您所指的更常见的循环案例是如何迭代数组项及其索引。

for i, e in enumerate(array):
    ...

for k,v in d.items():  
    ...

当迭代 dictionary 中的项目时。此外,如果您有两个列表,l1l2 您可以像这样遍历这两个内容

for e1, e2 in zip(l1,l2):
    ...

请注意,在迭代时长度不等的情况下,这将截断较长的列表。或者说您有一个列表列表,其中外部列表​​的长度为m,内部的长度为n,您宁愿遍历按索引分组在一起的内部光照中的元素。这有效地迭代了矩阵的转置,您也可以使用 zip 来执行此操作。

for inner_joined in zip(*matrix):  # will run m times
    # len(inner_joined) == m
    ...

【讨论】:

在这里提供zip 的示例也可能会有所帮助。 @rahlf23 同意 @rahlf23 也许只是一个 2 元组的列表作为点或其他东西。【参考方案3】:

Python 的 for 循环是一个基于迭代器的循环(这就是为什么 bruno desthuilliers 说它“适用于所有可迭代对象(列表、元组、集合、字典、迭代器、生成器等)”。字符串也是另一种常见的可迭代)。

假设您有一个元组列表。使用您共享的命名法,可以同时遍历键和值。例如:

tuple_list = [(1, "Countries, Cities and Villages"),(2,"Animals"),(3, "Objects")]

for k, v in tuple_list:
    print(k, v)

会给你输出:

1 Countries, Cities and Villages
2 Animals
3 Objects

如果您使用字典,您也将能够做到这一点。这里的区别是需要 .items()

dictionary = 1: "Countries, Cities and Villages", 2: "Animals", 3: "Objects"

for k, v in dictionary.items():
    print(k, v)

dictionary 和 dictionary.items() 的区别如下

dictionary: 1: 'Countries, Cities and Villages', 2: 'Animals', 3: 'Objects'
dictionary.items(): dict_items([(1, 'Countries, Cities and Villages'), (2, 'Animals'), (3, 'Objects')])

使用 dictionary.items() 我们将获得一个包含字典键值对的视图对象,作为列表中的元组。换句话说,使用 dictionary.items() 您还将获得一个元组列表。如果你不使用它,你会得到

TypeError: 无法解压不可迭代的 int 对象

如果您想使用简单列表获得相同的输出,则必须使用 enumerate() 之类的东西

list = ["Countries, Cities and Villages","Animals", "Objects"]

for k, v in enumerate(list, 1): # 1 means that I want to start from 1 instead of 0
    print(k, v)

如果你不这样做,你会得到

ValueError:解包的值太多(预计 2 个)

所以,这自然提出了一个问题……我是否总是需要一个元组列表?不需要。使用 enumerate() 我们将得到一个枚举对象。

【讨论】:

【参考方案4】:

实际上,“使用for循环迭代数组的最简单方法”(Python类型被命名为“list”顺便说一句)是第二种,即

for item in somelist:
    do_something_with(item)

哪个 FWIW 适用于所有可迭代对象(列表、元组、集合、字典、迭代器、生成器等)。

基于范围的 C 风格版本被认为是高度非 Python 的,并且仅适用于列表或类似列表的可迭代对象。

我想知道这是做什么的

for i, j in range(len(array)):
    # What is i and j here?

好吧,你可以自己测试一下……但结果很明显:它会引发TypeError,因为解包仅适用于可迭代对象,而整数不可迭代。

for i, j in array:
    # What is i and j in this case?

取决于array 是什么以及迭代它时产生的结果。如果是 2 元组列表或产生 2 元组的迭代器,ij 将是当前迭代项的元素,即:

array = [(letter, ord(letter)) for letter in "abcdef"]
for letter, letter_ord in array:
    print(" : ".format(letter, letter_ord))

否则,它很可能也会引发 TypeError。

请注意,如果您想同时拥有项目和索引,解决方案是内置 enumerate(sequence),它为每个项目生成一个 (index, item) 元组:

array = list("abcdef")
for index, letter in enumerate(array):
    print(" : ".format(index, letter)

【讨论】:

【参考方案5】:

我只是想补充一点,即使在 Python 中,您也可以使用经典的 C 样式循环,只需使用局部变量即可获得 for in 效果

l = len(mylist) #I often need to use this more than once anyways

for n in range(l-1):
    i = mylist[n]
    
    print("iterator:",n, " item:",i)

【讨论】:

以上是关于在 Python 的 for 循环中使用多个变量的主要内容,如果未能解决你的问题,请参考以下文章

Python中对于多个for循环和变量的列表理解

将 for 循环中的多个打印输出值存储到列表或变量中

在 python for 循环中一次运行 3 个变量。

Python for循环内变量自增为啥没有效果?

在多个 for 循环中使用相同的变量名是不好的做法吗?

python中for循环中的循环变量