我正在将Python脚本作为Hadoop流作业运行,但是这篇文章与某些核心Python概念相关,而不是有关Hadoop的知识。

基本上我有一组要查找重叠的线

$ cat sample.txt
ID1    2143,2154,
ID2    2913,14545
ID3    2143,2390,3350,5239,6250
ID4    2143,2154,2163,3340
ID5    2143,2154,2156,2163,3340,3711

最后,我希望找到重叠的记录对并对其进行计数,例如,此处类似:
2143,2154    3
2143,2163    2
2143,3340    2
2154,2163    2
2154,3340    2
2163,3340    2

我这样做的方法是创建一个用Python编写的Hadoop流作业,其中映射程序基本上将在给定的行上输出所有对组合,然后由reducer进行进一步处理。

我的问题实际上很简单:如何在Python中以给定行中所有对的组合有效地生成?请注意,在我的情况下,对(x,y)与对(y,x)相同。例如对于ID3我想要在我的映射器中生成以下列表:
[(2143,2390), (2143,2390), (2143,3350), (2143,5239), (2143,6250), (2390,3350), (2390,5239), (2390,6250), (3350,5239), (3350,6250), (5239,6250)]

我当然可以用一堆for循环来做到这一点,但这非常丑陋。我曾尝试使用itertools,但无法正确地使用它。有什么想法吗?

最佳答案

怎么样:

x = [2143, 2390, 3350, 5239, 6250]
itertools.combinations(x, 2)

给出:
(2143, 2390) (2143, 3350) (2143, 5239) (2143, 6250) (2390, 3350) (2390, 5239) (2390, 6250) (3350, 5239) (3350, 6250) (5239, 6250)

09-18 19:18