Python:对于循环-对于范围内的i(0,len(list)vs对于lis中的i

2024-05-14 10:06:23 发布

您现在位置:Python中文网/ 问答频道 /正文

这是一个非常简单的python力学问题。为什么我不能只说我在范围内的原始列表而不是我在范围内(0,len(原始列表))。人们通常使用的射程比前者大吗?谢谢!

# "If I give you an array with negative and positive numbers (i.e. {3,2,-3,6,4,-7}) and asked you to sort it so that the negative numbers appeared first but you didn't change the relative order of the remaining numbers, how would you do it? (i.e. the final result would be {-3,-7,3,2,6,4}).

original_list = [3, 2, -3, 6, 4, -7]
pos_list = []
neg_list = []

for i in range(0, len(original_list)):
    if original_list[i] < 0:
        neg_list.append(original_list[i])
    else:
        pos_list.append(original_list[i])

print neg_list + pos_list

Tags: andtheposyou列表lenitlist
3条回答

在您的例子中,由于您不需要使用列表中的项的索引,所以您可以使用for in对其进行迭代:

>>> for item in original_list:
...     if item < 0:
...         ...

如果要遍历列表中项的索引,请使用for in range(..)

>>> for i in range(len(original_list)):
...     if original_list[i] < 0:
...         ...

或者,如果您需要在循环的主体中同时使用项和索引,则还可以使用^{}

>>> for i, item in enumerate(original_list):
...    if item < 0:
...        ...

通过这种方式,您还消除了original_list[i]的使用。

构造range(len(my_sequence))通常不被认为是惯用的Python。它将您的代码集中在较低级别的机制上,而不是我们通常试图编写的,这使得它更难阅读。正因为如此,在这里使用range通常被看作是使用较低级别语言(如C)编写代码的人的一个持有者

例如,请看Raymond Hettinger的谈话Transforming Code into Beautiful Idiomatic Python—他建议的第一件事就是将for i in range(len(sequence))改为for item in sequence无论它出现在什么地方;然后他继续提到enumeratezip以涵盖那些您可能会试图恢复使用range的情况。他还提到习惯用法更快。除了Python内置类型被(毫不奇怪)优化以快速运行惯用结构之外,不难理解为什么某些其他数据结构也会出现这种情况——例如,链表的顺序访问比随机访问快得多,这意味着依赖my_linked_list[i]的循环可以成为二次时间运算,而不是线性时间运算。

如果您在codereview.SE跟踪[python]标记,您可以不时看到类似的建议。

不要使用range遍历值列表。做for item in list。如果需要索引,请使用枚举。

for index, value in enumerate(original_list):
    print index
    print value

或者

for item in original_list:
    if item < 0:
        neg_list.append(item)
    else:
        pos_list.append(item)

使用for item in original_list:可能会得到异常,因为您试图执行neg_list.append(original_list[item]),这可能导致original_list[-3]original_list[6]等超出范围的操作。

相关问题 更多 >

    热门问题