如何循环列表而不重复配对

时间:2019-07-11 16:00:42

标签: python

我想遍历列表以查找等于变量“ N”的对的总和。无需重复配对

list=[0,1,2,3,4]

重复对

[0,1],[1,0],[2,3],[3,2]....etc
[0,0],[1,1],[2,2],[3,3]...etc

代码

    num_list=[28,33,34,65,71]
    n=99
    pair=0
    count=0
    for i in range(len(num_list)-1):
        for j in range(len(num_list)):
            if i==j:
                pass
            else:
                pair=num_list[i] + num_list[j]
                if pair == n:
                    count+=1
    print(count)



预期产量

2

我的输出

3

3 个答案:

答案 0 :(得分:1)

使用itertools

from itertools import combinations
lst = [28,33,34,65,71]
n = 99
cnt = 0
for entry in combinations(lst,2):
  if sum(entry) == n:
    cnt +=1
print(cnt)

输出

2

答案 1 :(得分:0)

您要检查列表中的每个数字及其后的每个数字。您可以通过切片第一个列表来实现。

第一个循环将除最后一个数字以外的所有内容切片。您不需要它,因为您将对照所有其他数字进行检查。

第二个循环中,将所有数字从当前数字切到列表末尾,然后检查这些数字。除非列表中出现两次,否则您将不会检查任何单一数字。

num_list=[28,33,34,65,71]
n=99
count=0
for index, num1 in enumerate(num_list[:-1]):
    for num2 in num_list[index:]:
        if num1+num2 == n:
            count += 1
print(count)

输出:

2

答案 2 :(得分:0)

如果要使用现有的循环结构,可以添加一个列表来跟踪已经算作一对的num_list[i]值。然后,在每次迭代中,检查您的num_list[j]值是否在该列表中。如果是的话,那么您就知道这对已经被按相反的顺序计算了。

     num_list=[28,33,34,65,71]
    prev_i = [] #this will keep track of i's that have been in a counted pair
    n=99
    pair=0
    count=0
    for i in range(len(num_list)-1):
        for j in range(len(num_list)):
            if i==j:
                pass
            else:
                pair=num_list[i] + num_list[j]
                #Check if pair are the same or already counted
                if pair == n and (not num_list[j] in prev_i):
                    prev_i.append(num_list[i]) #add i to the prev_i list
                    count+=1
    print(count)