我使用枚举函数编写了一些Python代码。
A = [2,3,5,7]
for i, x in enumerate(A):
# calculate product with each element to the right
for j, y in enumerate(A, start=i+1):
print(x*y)
我预计它会计算6种产品:2 * 3,2 * 5,2 * 7,3 * 5,3 * 7,5 * 7
相反,它计算了所有可能的16种产品。发生了什么事?
答案 0 :(得分:7)
start
的{{1}}参数仅影响所产生元组的第一个值(即enumerate
和i
),它不会影响枚举开始的索引。正如the manual所说,j
等同于:
enumerate
你想要的是这个:
def enumerate(sequence, start=0):
n = start
for elem in sequence:
yield n, elem
n += 1
答案 1 :(得分:2)
这里的问题首先是枚举的内容,其次是你使用它的原因。枚举的基本功能是将形式为(a,b,c)
的可迭代转换为((start,a), (start+1,b), (start+2,c))
形式的可迭代。它添加了一个新列,通常用作索引;在您的代码中,这是i
和j
。它不会更改序列中包含的条目。
我相信你想要的操作是一个切片,只提取列表的一部分:
for i, x in enumerate(A):
for y in A[i+1:]:
print(x*y)
如果重要的是不复制列表(很少),则可以将A[i+1:]
替换为itertools.islice(A, i+1, len(A))
。
附注是start
参数在此代码的外部循环中可能很有用。我们只使用i+1
,而不是i
,因此我们也可以将该值用作索引:
for nextindex, x in enumerate(A, 1):
for y in A[nextindex:]:
print(x*y)