我正在将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)