对列表中的每对元素进行操作
我想使用 Python 比较列表中的每个可能的对。
假设我
my_list = [1,2,3,4]
想对列表中 2 个元素的每个组合执行一个操作(我们称之为 foo)。
相同,但这看起来不太Pythonic。
foo(1,1)
foo(1,2)
...
foo(4,3)
foo(4,4)
最终结果应该与我的第一个想法是手动迭代列表两次
Using Python, I'd like to compare every possible pair in a list.
Suppose I have
my_list = [1,2,3,4]
I'd like to do an operation (let's call it foo) on every combination of 2 elements from the list.
The final result should be the same as
foo(1,1)
foo(1,2)
...
foo(4,3)
foo(4,4)
My first thought was to iterate twice through the list manually, but that doesn't seem very pythonic.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
查看
product()
中的 <代码>itertools模块。 它的作用正是你所描述的。这相当于:
编辑:还有两个非常相似的函数,
permutations()
和combinations()
。 为了说明它们有何不同:product()
生成所有可能的元素配对,包括所有重复项:permutations()
生成每个唯一元素对的所有唯一排序,从而消除了x,x
重复:最后,
combinations()
仅按字典顺序生成每个唯一的元素对:所有这三个函数都是在 Python 2.6 中引入的。
Check out
product()
in theitertools
module. It does exactly what you describe.This is equivalent to:
Edit: There are two very similar functions as well,
permutations()
andcombinations()
. To illustrate how they differ:product()
generates every possible pairing of elements, including all duplicates:permutations()
generates all unique orderings of each unique pair of elements, eliminating thex,x
duplicates:Finally,
combinations()
only generates each unique pair of elements, in lexicographic order:All three of these functions were introduced in Python 2.6.
我遇到了类似的问题,并在此处找到了解决方案。 它无需导入任何模块即可工作。
假设一个列表如下:
简化的单行解决方案如下所示。
所有可能的对,包括重复项:
所有可能的对,不包括重复项:
唯一对,其中顺序无关:
如果您不想要操作但只是为了获取对,删除函数 foo 并仅使用元组就足够了。
所有可能的对,包括重复项:
结果:
所有可能的对,不包括重复项:
结果:
唯一对,其中顺序无关:
结果:
< em>编辑:在重新设计以简化此解决方案后,我意识到它与 Adam Rosenfield 的方法相同。 我希望更详细的解释可以帮助一些人更好地理解它。
I had a similar problem and found the solution here. It works without having to import any module.
Supposing a list like:
A simplified one-line solution would look like this.
All possible pairs, including duplicates:
All possible pairs, excluding duplicates:
Unique pairs, where order is irrelevant:
In case you don't want to operate but just to get the pairs, removing the function
foo
and using just a tuple would be enough.All possible pairs, including duplicates:
Result:
All possible pairs, excluding duplicates:
Result:
Unique pairs, where order is irrelevant:
Result:
Edit: After the rework to simplify this solution, I realised it is the same approach than Adam Rosenfield. I hope the larger explanation helps some to understand it better.
如果您只是调用一个函数,那么您实际上不能做得比以下更好:
如果您想收集调用该函数的结果列表,您可以这样做:
这将返回应用 < 的结果列表code>foo(i, j) 到每个可能的对
(i, j)
。If you're just calling a function, you can't really do much better than:
If you want to collect a list of the results of calling the function, you can do:
which will return you a list of the result of applying
foo(i, j)
to each possible pair(i, j)
.如果您希望组合按字典顺序排序,Ben Bank 的答案效果很好。 但是,如果您希望组合随机排序,这里有一个解决方案:
示例用法
N=100
和k=4
的:结果为:
用例
对于我的用例,我正在实现一种算法,该算法正在搜索单个(或几个)组合,并在找到有效组合时停止。 平均而言,它遍历所有可能组合的一个非常小的子集,因此不需要预先构建所有可能的组合,然后进行洗牌(无论如何,总体规模太大,无法容纳内存中的所有组合)。
随机性对于快速找到解决方案至关重要,因为字典顺序会导致总体中的单个值包含在所有组合中,直到耗尽为止。 例如,如果我们有
n=100
和k=4
,那么结果将类似于:如果
0
不是有效解的一部分,那么我们将无缘无故地搜索 156849 个组合。 随机化顺序有助于缓解此问题(请参阅上面的示例输出)。Ben Bank's answer works well if you want the combinations to be ordered lexicographically. However, if you want the combinations to be randomly ordered, here's a solution:
Example Usage
For
N=100
andk=4
:results in:
Use Case
For my use case, I'm implementing an algorithm that's searching for a single (or a few) combination and halts when it finds a valid combination. On average, it traverses a very small subset of all possible combinations, so there's no need to build all possible combinations up front and then shuffle (the population size is too big to fit all combinations in memory, anyway).
The randomness is crucial to finding a solution quickly because lexicographic ordering results in a single value in the population being included in all combinations until it's exhausted. For example, if we have
n=100
andk=4
, then the results will be like:If
0
is not part of a valid solution, then we will have searched 156849 combinations for no reason. Randomizing the order helps mitigate this issue (see example output above).