Computer >> Máy Tính >  >> Lập trình >> Python

Tìm tất cả các bộ ba trong danh sách với tổng cho trước bằng Python

Trong một danh sách các số, chúng ta muốn tìm ra ba phần tử có thể tham gia để đưa ra một tổng nhất định. Chúng tôi gọi nó là sinh ba. Và trong danh sách có thể có nhiều cặp sinh ba như vậy. Ví dụ, tổng 10 có thể được tạo ra ở dạng số 1,6,3 cũng như 1,5,4. Trong bài viết này, chúng ta sẽ xem cách tìm ra tất cả các bộ ba như vậy từ một danh sách các số nhất định.

Sử dụng biến phạm vi và biến tạm thời

Đây là cách tiếp cận truyền thống, trong đó chúng tôi sẽ tạo các biến tạm thời. Các biến này sẽ giữ các phần tử từ danh sách và kiểm tra xem tổng của chúng có bằng với giá trị bắt buộc hay không. Sau đó, nó sẽ tiếp tục tích lũy các biến như vậy vào tập kết quả cuối cùng.

Ví dụ

def SumTriplets(listA, sum):
   trpltcnt = 0
   res = []

   for i in range(0, len(listA) - 1):

      s = set()
      tmp = []

      # Adding first element
      tmp.append(listA[i])

      current_sum = sum - listA[i]

      for j in range(i + 1, len(listA)):

         if (current_sum - listA[j]) in s:
            trpltcnt += 1

            # Adding second element
            tmp.append(listA[j])

            # Adding third element
            tmp.append(current_sum - listA[j])

            # Appending tuple to the final list
            res.append(tuple(tmp))
            tmp.pop(2)
            tmp.pop(1)
         s.add(listA[j])

   return res


listA = [11,12,13,14,15,16,17,18,19,20]

print("Required triplets:\n",SumTriplets(listA, 40))

Đầu ra

Chạy đoạn mã trên cho chúng ta kết quả sau -

Required triplets:
[(11, 15, 14), (11, 16, 13), (11, 17, 12), (12, 15, 13)]

Ví dụ

from itertools import combinations

listA = [11,12,13,14,15,16,17,18,19,20]

def fsum(val):
      return sum(val) == 40

res = list(filter(fsum,list(combinations(listA, 3))))

print("Required triplets:\n",res)

Đầu ra

Chạy đoạn mã trên cho chúng ta kết quả sau -

Required triplets:
[(11, 12, 17), (11, 13, 16), (11, 14, 15), (12, 13, 15)]