是否需要范围(len(a))?

Hyp*_*eus 63 python for-loop range

人们常常在SO的python问题中找到这种类型的表达式.要么只是访问iterable的所有项目

for i in range(len(a)):
    print(a[i])
Run Code Online (Sandbox Code Playgroud)

这只是一种繁琐的写作方式:

for e in a:
    print(e)
Run Code Online (Sandbox Code Playgroud)

或者为了分配可迭代的元素:

for i in range(len(a)):
    a[i] = a[i] * 2
Run Code Online (Sandbox Code Playgroud)

哪个应该是相同的:

for i, e in enumerate(a):
     a[i] = e * 2
# Or if it isn't too expensive to create a new iterable
a = [e * 2 for e in a]
Run Code Online (Sandbox Code Playgroud)

或者对索引进行过滤:

for i in range(len(a)):
    if i % 2 == 1: continue
    print(a[i])
Run Code Online (Sandbox Code Playgroud)

可以这样表达:

for e in a [::2]:
    print(e)
Run Code Online (Sandbox Code Playgroud)

或者当您只需要列表的长度而不是其内容时:

for _ in range(len(a)):
    doSomethingUnrelatedToA()
Run Code Online (Sandbox Code Playgroud)

可能是:

for _ in a:
    doSomethingUnrelatedToA()
Run Code Online (Sandbox Code Playgroud)

在蟒蛇我们enumerate,切片,filter,sorted,等...至于蟒蛇for结构旨在遍历iterables不仅整数的范围,是你需要有真实世界的使用情况in range(len(a))

Jon*_*nts 11

如果你需要使用序列的索引,那么是 - 你使用它...例如相当于numpy.argsort ...:

>>> a = [6, 3, 1, 2, 5, 4]
>>> sorted(range(len(a)), key=a.__getitem__)
[2, 3, 1, 5, 4, 0]
Run Code Online (Sandbox Code Playgroud)

  • 相当于:“[ix for ix, _ in Sorted(enumerate(a), key=lambda i: i[1])]”,尽管你的可以说更好/更极客。 (2认同)

Eri*_*lun 6

简短回答:从数学上讲,不,实际上,是的,例如对于故意编程.

从技术上讲,我认为数学上正确的答案是"不,它不需要",因为它可以使用其他结构表达,即它等同于其他结构......就像一个语言是图灵完整的那样,它在哪个句法上并不重要/范式构造它,因为无论如何一切都可以在其中表达.

但实际上,我使用for i in range(len(a)(或者for _ in range(len(a))如果我不需要索引)使它明确表示我想迭代序列中的项目的次数,而不需要使用序列中的项目.

那么回答"有需要吗?" part -I 需要它来表达代码的含义/意图以便于阅读.

另见:https://en.wikipedia.org/wiki/Intentional_programming

PS但同时,从故意编程的角度看,以下似乎在语义上是等价的:

for _ in a:
    ...
Run Code Online (Sandbox Code Playgroud)

要么

b = ["hello" for _ in a]
Run Code Online (Sandbox Code Playgroud)

...总而言之,我猜不同之处在于你是否真的要明确"重复多次出现,因为有些项目a",而不是"对于每一个元素a,无论内容是什么a" ......所以最后只是故意编程的细微差别.

  • 要获得一个包含与列表 `a` 中一样多的项目的 `'hello'` 列表,请使用 `b = ['hello'] * len(a)` (2认同)

Gis*_*wok 6

如果您需要同时访问列表中的两个元素,该怎么办?

for i in range(len(a[0:-1])):
    something_new[i] = a[i] * a[i+1]
Run Code Online (Sandbox Code Playgroud)

你可以使用它,但它可能不太清楚:

for i, _ in enumerate(a[0:-1]):
     something_new[i] = a[i] * a[i+1]
Run Code Online (Sandbox Code Playgroud)

就个人而言,我对这两者都不是百分之百!

  • 人们应该使用 [pairwise](https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.pairwise) 来代替。 (3认同)
  • 在这些情况下我会这样做: `for a1,a2 in zip(a[:-1],a[1:])` (3认同)