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

Ely*_*off 2 python arrays for-loop python-2.x

我试图更深入地了解forPython中不同数据类型的循环.使用for循环迭代数组的最简单方法是

for i in range(len(array)):
    do_something(array[i])
Run Code Online (Sandbox Code Playgroud)

我也知道我可以

for i in array:
    do_something(i)
Run Code Online (Sandbox Code Playgroud)

我想知道的是这是做什么的

for i, j in range(len(array)):
    # What is i and j here?
Run Code Online (Sandbox Code Playgroud)

要么

for i, j in array:
    # What is i and j in this case?
Run Code Online (Sandbox Code Playgroud)

如果我尝试使用与dict离子电池相同的想法,会发生什么tuples

mod*_*itt 7

你的第三个循环将不起作用,因为它会抛出 a TypeErrorfor an intnot being iterable。这是因为您试图将unpack作为数组索引的 int 插入到 中ij这是不可能的。一个解包的例子是这样的:

tup = (1,2)
a,b = tup
Run Code Online (Sandbox Code Playgroud)

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

train_X, train_Y, validate_X, validate_Y = make_data(data)
Run Code Online (Sandbox Code Playgroud)

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

for i, e in enumerate(array):
    ...
Run Code Online (Sandbox Code Playgroud)

for k,v in d.items():  
    ...
Run Code Online (Sandbox Code Playgroud)

当迭代 a 中的项目时dictionary。此外,如果您有两个列表,l1并且l2可以像这样迭代这两个内容

for e1, e2 in zip(l1,l2):
    ...
Run Code Online (Sandbox Code Playgroud)

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

for inner_joined in zip(*matrix):  # will run m times
    # len(inner_joined) == m
    ...
Run Code Online (Sandbox Code Playgroud)

  • 在这里提供一个 `zip` 示例也可能会有所帮助。 (2认同)

wim*_*wim 7

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

for i in array:
    do_something(i)
Run Code Online (Sandbox Code Playgroud)

永远不要这样做:

for i in range(len(array)):
    do_something(array[i])
Run Code Online (Sandbox Code Playgroud)

如果由于某种原因(通常你没有)需要数组中的索引,那么请改为:

for i, element in enumerate(array):
    print("working with index", i)
    do_something(element)
Run Code Online (Sandbox Code Playgroud)

这是一个错误:

for i, j in range(len(array)):
    # What is i and j here?
Run Code Online (Sandbox Code Playgroud)

您将TypeError: 'int' object is not iterable尝试将一个整数解压缩为两个名称.

for i, j in array:
    # What is i and j in this case?
Run Code Online (Sandbox Code Playgroud)

它假定数组是"二维的",例如:

>>> for i, j in [(0, 1), ('a', 'b')]:
...     print('i:', i, 'j:', j)
...     
i: 0 j: 1
i: a j: b
Run Code Online (Sandbox Code Playgroud)

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


Tia*_*ica 6

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

假设您有一个元组列表。使用您共享的术语,人们可以同时迭代键和值。例如:

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

for k, v in tuple_list:
    print(k, v)
Run Code Online (Sandbox Code Playgroud)

会给你输出:

1 Countries, Cities and Villages
2 Animals
3 Objects
Run Code Online (Sandbox Code Playgroud)

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

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

for k, v in dictionary.items():
    print(k, v)
Run Code Online (Sandbox Code Playgroud)

字典和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')])
Run Code Online (Sandbox Code Playgroud)

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

类型错误:无法解压不可迭代的 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)
Run Code Online (Sandbox Code Playgroud)

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

ValueError:需要解压的值太多(预期为 2)

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