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不需要的。