对列表中的每对元素进行操作

Gui*_*Sim 80 python

使用Python,我想比较列表中的每个可能的对.

假设我有

my_list = [1,2,3,4]
Run Code Online (Sandbox Code Playgroud)

我想对列表中的2个元素的每个组合进行操作(让我们称之为foo).

最终结果应该是相同的

foo(1,1)
foo(1,2)
...
foo(4,3)
foo(4,4)
Run Code Online (Sandbox Code Playgroud)

我的第一个想法是手动迭代两次列表,但这似乎不是pythonic.

Ben*_*ank 200

product()itertools模块中查看.它完全符合您的描述.

import itertools

my_list = [1,2,3,4]
for pair in itertools.product(my_list, repeat=2):
    foo(*pair)
Run Code Online (Sandbox Code Playgroud)

这相当于:

my_list = [1,2,3,4]
for x in my_list:
    for y in my_list:
        foo(x, y)
Run Code Online (Sandbox Code Playgroud)

编辑:有两个非常相似的功能,permutations()combinations().为了说明它们的不同之处:

product() 生成所有可能的元素配对,包括所有重复:

1,1  1,2  1,3  1,4
2,1  2,2  2,3  2,4
3,1  3,2  3,3  3,4
4,1  4,2  4,3  4,4
Run Code Online (Sandbox Code Playgroud)

permutations()生成每个唯一元素对的所有唯一排序,消除x,x重复:

 .   1,2  1,3  1,4
2,1   .   2,3  2,4
3,1  3,2   .   3,4
4,1  4,2  4,3   .
Run Code Online (Sandbox Code Playgroud)

最后,combinations()仅按字典顺序生成每个唯一的元素对:

 .   1,2  1,3  1,4
 .    .   2,3  2,4
 .    .    .   3,4
 .    .    .    .
Run Code Online (Sandbox Code Playgroud)

所有这三个函数都是在Python 2.6中引入的.

  • 还有combinations_with_replacement()。像组合(),但包括对角线(与插图一致)。 (3认同)
  • 实际上我正在寻找的是itertools.combinations ..但我的问题并不清楚.感谢你,我仍然得到了答案;) (2认同)
  • +1.itertools非常棒,并且在Python 2.6中获得了许多新功能.每个新手python教程都应该介绍这个模块恕我直言. (2认同)
  • 对于懒惰者:要使用“permutations()”和“combinations()”获得上述结果,请使用“r=2”代替“product()”示例中使用的“repeat=2” (2认同)

J0A*_*NMM 9

我有类似的问题,在这里找到了解决方案.无需导入任何模块即可运行.

假设一个列表如下:

people = ["Lisa","Pam","Phil","John"]
Run Code Online (Sandbox Code Playgroud)

简化的单行解决方案如下所示.

所有可能的对,包括重复:

result = [foo(p1, p2) for p1 in people for p2 in people]
Run Code Online (Sandbox Code Playgroud)

所有可能的对,不包括重复:

result = [foo(p1, p2) for p1 in people for p2 in people if p1 != p2]
Run Code Online (Sandbox Code Playgroud)

唯一对,订单无关紧要:

result = [foo(people[p1], people[p2]) for p1 in range(len(people)) for p2 in range(p1+1,len(people))]
Run Code Online (Sandbox Code Playgroud)

如果您不想操作而只是为了获得对,那么删除该功能foo并仅使用元组就足够了.

所有可能的对,包括重复:

list_of_pairs = [(p1, p2) for p1 in people for p2 in people]
Run Code Online (Sandbox Code Playgroud)

结果:

('Lisa', 'Lisa')
('Lisa', 'Pam')
('Lisa', 'Phil')
('Lisa', 'John')
('Pam', 'Lisa')
('Pam', 'Pam')
('Pam', 'Phil')
('Pam', 'John')
('Phil', 'Lisa')
('Phil', 'Pam')
('Phil', 'Phil')
('Phil', 'John')
('John', 'Lisa')
('John', 'Pam')
('John', 'Phil')
('John', 'John')
Run Code Online (Sandbox Code Playgroud)

所有可能的对,不包括重复:

list_of_pairs = [(p1, p2) for p1 in people for p2 in people if p1 != p2]
Run Code Online (Sandbox Code Playgroud)

结果:

('Lisa', 'Pam')
('Lisa', 'Phil')
('Lisa', 'John')
('Pam', 'Lisa')
('Pam', 'Phil')
('Pam', 'John')
('Phil', 'Lisa')
('Phil', 'Pam')
('Phil', 'John')
('John', 'Lisa')
('John', 'Pam')
('John', 'Phil')
Run Code Online (Sandbox Code Playgroud)

唯一对,订单无关紧要:

list_of_pairs = [(people[p1], people[p2]) for p1 in range(len(people)) for p2 in range(p1+1,len(people))]
Run Code Online (Sandbox Code Playgroud)

结果:

('Lisa', 'Pam')
('Lisa', 'Phil')
('Lisa', 'John')
('Pam', 'Phil')
('Pam', 'John')
('Phil', 'John')
Run Code Online (Sandbox Code Playgroud)

编辑:在简化此解决方案的返工之后,我意识到它与Adam Rosenfield的方法相同.我希望更大的解释能帮助一些人更好地理解它.

  • itertools 是 Python 的一部分。它不是外部库。 (3认同)
  • 我非常喜欢此方法,而不是导入一个更干净的库! (2认同)