2016-10-27 107 views
0

問題是: 給出一個正整數的排序數組和一個數字'X'。打印出總和等於X的所有數字對。打印出唯一的唯一對,並且對應按照升序排列。從Python中選擇唯一對列表

input is: 1,2,3,4,6;5 
output should be : 1,4;2,3 

到目前爲止我的代碼:

with open('/tmp/values.txt') as f: 
    for numbers in f: 
    num_list,sum_list = [ num.split(",") for num in numbers.rstrip().split(";")] 
sum_list = list(map(int,sum_list)) 
op1 = [(num_list[i],num_list[j]) for i in range(0,len(num_list)) for j in range(0,len(num_list)) if (eval(num_list[i])+eval(num_list[j]) == sum_list[0])] 
print (op1) 

輸出我得到的是:

[('1', '4'), ('2', '3'), ('3', '2'), ('4', '1')] 

任何人都可以,請幫助我的邏輯來選擇( '1', '4')和('2','3')從上面的列表?

回答

1

由於加法是可交換的,你並不需要檢查兩次:

with open('/tmp/values.txt') as f: 
    for numbers in f: 
     num_list, sum_list = [num.split(",") for num in numbers.rstrip().split(";")] 

     sum_list = list(map(int, sum_list)) 
     op1 = [(num_list[i], num_list[j]) for i in range(len(num_list)) for j in range(i+1, len(num_list)) if (int(num_list[i]) + int(num_list[j]) == sum_list[0])] 
     print(op1) 

有一個O(n)解決方案(我將離開作爲一個練習留給讀者。)。

0

做兩個嵌套循環時有一個巧妙的把戲。如果你不想要的一切,從第二個列表中你這樣做:

for i in range(0, 5): 
    for j in range (i+1, 5): 
     print str(i)+", "+str(j) 

這導致:

0, 1 
0, 2 
0, 3 
0, 4 
1, 2 
1, 3 
1, 4 
2, 3 
2, 4 
3, 4 

這可以確保你不保持連連循環在相同的數字。這種事情告訴第二個循環不要在第一個循環的同一個地方開始,而只是從尚未得到的數字開始。 (如果你想要像0, 01, 1等的雙打,只需拿出+1i)。

在你的代碼

你有兩個循環:

for i in range(0,len(num_list)) for j in range(0,len(num_list)) 

你可以在第二循環更改爲:

for j in range(i+1,len(num_list))