2009-09-14 25 views

回答

11

如果你只關心有序的關係,你可以做到以下幾點:

>>> for i, u in enumerate(users[1:]): 
    print(users[i], u)   # or do something else 


1 2 
2 3 
3 4 
4 5 

,如果你需要您應該使用的所有組合itertools.combinations

>>> import itertools 
>>> for i in itertools.combinations(users, 2): 
    print(*i) 

1 2 
1 3 
1 4 
1 5 
2 3 
2 4 
2 5 
3 4 
3 5 
4 5 
+0

+1,用於向我展示另一個我不知道存在的Python函數:)。 – 2009-09-14 10:36:59

+0

'itertools'充滿了寶石;) – SilentGhost 2009-09-14 10:38:42

+0

>爲我在itertools.combinations(用戶,2): 非常優雅!感謝您的解決方案! – Hobhouse 2009-09-14 10:39:43

0

用於循環或列表理解。

這裏是循環例如:

for u in users: 
    for su in users: 
     if su == u: 
      pass 
     else: 
      score = compatibility(u, su) 
      # do score whatever you want 

列表理解:

score = [compatibility(x, y) for x in users for y in users if x!=y and compatibility(x,y) not in score] 
+0

兼容性看起來像交換操作。在這種情況下,您計算每個用戶對的兼容性兩次,一次是兼容性(A,B),另一次是兼容性(B,A)。 – bendin 2009-09-14 10:31:30

+0

@bendin,yup正確,但添加兼容性(x,y)而不是分數將確保配對中只有一個關係。 – Mohamed 2009-09-14 10:45:24

0

類似下面應該工作(未測試):

users_range = range(len(users)) 

# Initialize a 2-dimensional array 
scores = [None for j in users_range for i in users_range] 

# Assign a compatibility to each pair of users. 
for i in users_range: 
    for j in users_range: 
     scores[i][j] = compatibility(users[i], users[j]) 
0

我能夠做到什麼,我想這一點:

i = 0 
for user1 in users: 
    i += 1  
    for user2 in users[i:]: 
     print compatibility(user1, user2) 
0

如果你的意思是:

compatibility(user[0], user[1]) == compatibility(user[1], user[0]) 

你可以使用:

for i, user1 in enumerate(users): 
    for user2 in users[i:]: 
     score = compatibility(user1, user2) 

這也將計算相同的用戶(也許適用)

0
import itertools 

def compatibility(u1, u2): 
    "just a stub for demonstration purposes" 
    return abs(u1 - u2) 

def compatibility_map(users): 
    return dict(((u1, u2), compatibility(u1, u2)) 
     for u1, u2 in itertools.combinations(users, 2)) 

> compat.compatiblity_map([1,2,3,4,5]) 
{(1, 2): 1, (1, 3): 2, (4, 5): 1, (1, 4): 3, (1, 5): 4, 
(2, 3): 1, (2, 5): 3, (3, 4): 1, (2, 4): 2, (3, 5): 2} 

使用itertools.permuations代替itertools.combinations之間的兼容性,如果兼容性(A,B),並不意味着同樣的事情,兼容性(b,A)。