枚举函数令人惊讶的行为

时间:2016-10-03 09:56:26

标签: python

我使用枚举函数编写了一些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种产品。发生了什么事?

2 个答案:

答案 0 :(得分:7)

start的{​​{1}}参数仅影响所产生元组的第一个值(即enumeratei),它不会影响枚举开始的索引。正如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))形式的可迭代。它添加了一个新列,通常用作索引;在您的代码中,这是ij。它不会更改序列中包含的条目。

我相信你想要的操作是一个切片,只提取列表的一部分:

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)