我有一個用戶列表:如何循環一次列表中的關係?
users = [1,2,3,4,5]
我想計算它們之間的關係:
score = compatibility(user[0], user[1])
如何遍歷用戶,讓用戶之間的關係,只計算一次?
我有一個用戶列表:如何循環一次列表中的關係?
users = [1,2,3,4,5]
我想計算它們之間的關係:
score = compatibility(user[0], user[1])
如何遍歷用戶,讓用戶之間的關係,只計算一次?
如果你只關心有序的關係,你可以做到以下幾點:
>>> 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
用於循環或列表理解。
這裏是循環例如:
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]
類似下面應該工作(未測試):
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])
我能夠做到什麼,我想這一點:
i = 0
for user1 in users:
i += 1
for user2 in users[i:]:
print compatibility(user1, user2)
如果你的意思是:
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)
這也將計算相同的用戶(也許適用)
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)。
+1,用於向我展示另一個我不知道存在的Python函數:)。 – 2009-09-14 10:36:59
'itertools'充滿了寶石;) – SilentGhost 2009-09-14 10:38:42
>爲我在itertools.combinations(用戶,2): 非常優雅!感謝您的解決方案! – Hobhouse 2009-09-14 10:39:43