在 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?
如果我尝试对dict
ionaries 或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, 3
和a, 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 到 i
和 j
,这是不可能的。拆包的一个例子是这样的:
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
中的项目时。此外,如果您有两个列表,l1
和 l2
您可以像这样遍历这两个内容
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 元组的迭代器,i
和 j
将是当前迭代项的元素,即:
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 循环中使用多个变量的主要内容,如果未能解决你的问题,请参考以下文章