Python 如何在列表中只循环一次关系?
我有一个用户列表:Python 如何在列表中只循环一次关系?,python,Python,我有一个用户列表: users = [1,2,3,4,5] 我想计算它们之间的关系: score = compatibility( user[0], user[1] ) 如何循环用户以使用户之间的关系只计算一次?用于循环或列表理解 以下是循环示例: for u in users: for su in users: if su == u: pass else: score = compatibility(u
users = [1,2,3,4,5]
我想计算它们之间的关系:
score = compatibility( user[0], user[1] )
如何循环用户以使用户之间的关系只计算一次?用于循环或列表理解 以下是循环示例:
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]
用于循环或列表理解 以下是循环示例:
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]
如果您只关心有序关系,则可以执行以下操作:
>>> for i, u in enumerate(users[1:]):
print(users[i], u) # or do something else
1 2
2 3
3 4
4 5
如果需要所有组合,则应使用:
如果您只关心有序关系,则可以执行以下操作:
>>> for i, u in enumerate(users[1:]):
print(users[i], u) # or do something else
1 2
2 3
3 4
4 5
如果需要所有组合,则应使用:
类似于以下的功能应该可以工作(未经测试):
类似于以下的功能应该可以工作(未经测试):
我成功地做到了我想要的:
i = 0
for user1 in users:
i += 1
for user2 in users[i:]:
print compatibility( user1, user2 )
我成功地做到了我想要的:
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)
这还将计算相同用户之间的兼容性(可能适用)如果您的意思是:
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)
这还将计算相同用户之间的兼容性(可能适用)
如果兼容性(a,b)与兼容性(b,a)的含义不同,请使用itertools.permulation而不是itertools.combines
如果兼容性(a,b)与兼容性(b,a)的含义不同,请使用itertools.permulations而不是itertools.combines。兼容性看起来像一个交换操作。在这种情况下,您将计算每个用户对的兼容性两次,一次作为兼容性(A,B),另一次作为兼容性(B,A)。@bendin,是的,正确,但在分数中添加兼容性(x,y)将确保该对中只有一个关系。兼容性看起来像一个交换操作。在这种情况下,您将计算每个用户对的兼容性两次,一次是兼容性(A,B),另一次是兼容性(B,A)。@bendin,是的,正确,但添加了兼容性(x,y)not in score将确保这对函数中只有一个关系。+1用于向我展示另一个我不知道存在的Python函数:)。
itertools
充满了宝石;)>对于我来说,在itertools中。组合(用户,2):非常优雅!感谢您提供此解决方案<代码>itertools。组合生成所有组合,而不是置换<代码>itertools。排列将产生(1,2)
和(2,1)
@Alasdair:这正是OP不需要的。+1用于向我展示另一个我不知道存在的Python函数:)。itertools
充满了宝石;)>对于我来说,在itertools中。组合(用户,2):非常优雅!感谢您提供此解决方案<代码>itertools。组合生成所有组合,而不是置换<代码>itertools。排列将产生(1,2)
和(2,1)
@Alasdair:这正是OP不需要的。