这是一个非常简单的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
在您的例子中,由于您不需要使用列表中的项的索引,所以您可以使用
for in
对其进行迭代:如果要遍历列表中项的索引,请使用
for in range(..)
:或者,如果您需要在循环的主体中同时使用项和索引,则还可以使用^{} :
通过这种方式,您还消除了
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
无论它出现在什么地方;然后他继续提到enumerate
和zip
以涵盖那些您可能会试图恢复使用range
的情况。他还提到习惯用法更快。除了Python内置类型被(毫不奇怪)优化以快速运行惯用结构之外,不难理解为什么某些其他数据结构也会出现这种情况——例如,链表的顺序访问比随机访问快得多,这意味着依赖my_linked_list[i]
的循环可以成为二次时间运算,而不是线性时间运算。如果您在codereview.SE跟踪[python]标记,您可以不时看到类似的建议。
不要使用range遍历值列表。做
for item in list
。如果需要索引,请使用枚举。或者
使用
for item in original_list:
可能会得到异常,因为您试图执行neg_list.append(original_list[item])
,这可能导致original_list[-3]
或original_list[6]
等超出范围的操作。相关问题 更多 >
编程相关推荐