在列表数组中对对进行分组

时间:2018-06-13 10:27:42

标签: python list match

我在不同的配对变量中运行了多矛符相关性,发现这些列最相关。我想在这些相关性e.g. [col_147,col_141,col_319]中找到成对的组,其中可能彼此完全配对。

array([list(['col_165', 'col_184']), list(['col_147', 'col_319']),
       list(['col_141', 'col_319']), list(['col_142', 'col_148']),
       list(['col_312', 'col_316']), list(['col_141', 'col_316']),
       list(['col_147', 'col_316']), list(['col_316', 'col_319']),
       list(['col_141', 'col_312']), list(['col_147', 'col_312']),
       list(['col_312', 'col_319']), list(['col_314', 'col_318']),
       list(['col_141', 'col_142']), list(['col_142', 'col_147']),
       list(['col_147', 'col_148']), list(['col_141', 'col_148']),
       list(['col_142', 'col_319']), list(['col_311', 'col_317']),
       list(['col_148', 'col_319']), list(['col_142', 'col_316']),
       list(['col_148', 'col_316']), list(['col_142', 'col_312']),
       list(['col_148', 'col_312']), list(['col_313', 'col_317']),
       list(['col_313', 'col_315']), list(['col_149', 'col_316']),
       list(['col_149', 'col_312']), list(['col_143', 'col_147']),
       list(['col_141', 'col_143']), list(['col_143', 'col_319']),
       list(['col_143', 'col_148']), list(['col_23', 'col_25']),
       list(['col_149', 'col_319']), list(['col_141', 'col_149']),
       list(['col_147', 'col_149']), list(['col_311', 'col_313']),
       list(['col_143', 'col_315']), list(['col_149', 'col_311']),
       list(['col_142', 'col_149']), list(['col_142', 'col_143']),
       list(['col_143', 'col_316']), list(['col_143', 'col_312']),
       list(['col_143', 'col_317']), list(['col_148', 'col_149']),
       list(['col_315', 'col_317']), list(['col_149', 'col_313']),
       list(['col_151', 'col_48']), list(['col_145', 'col_151']),
       list(['col_145', 'col_170']), list(['col_170', 'col_48']),
       list(['col_145', 'col_189']), list(['col_189', 'col_48']),
       list(['col_148', 'col_318']), list(['col_145', 'col_18']),
       list(['col_18', 'col_48']), list(['col_142', 'col_318']),
       list(['col_188', 'col_312']), list(['col_187', 'col_312']),
       list(['col_169', 'col_312']), list(['col_168', 'col_312']),
       list(['col_170', 'col_245']), list(['col_189', 'col_245']),
       list(['col_151', 'col_245']), list(['col_143', 'col_313']),
       list(['col_149', 'col_317']), list(['col_188', 'col_316']),
       list(['col_187', 'col_316']), list(['col_169', 'col_316']),
       list(['col_168', 'col_316']), list(['col_145', 'col_245']),
       list(['col_245', 'col_48']), list(['col_184', 'col_76']),
       list(['col_184', 'col_75']), list(['col_165', 'col_76']),
       list(['col_165', 'col_75']), list(['col_187', 'col_314']),
       list(['col_188', 'col_314']), list(['col_169', 'col_314']),
       list(['col_168', 'col_314']), list(['col_148', 'col_314']),
       list(['col_141', 'col_188']), list(['col_141', 'col_187']),
       list(['col_147', 'col_188']), list(['col_147', 'col_187']),
       list(['col_141', 'col_169']), list(['col_141', 'col_168']),
       list(['col_147', 'col_169']), list(['col_147', 'col_168'])],
      dtype=object)

首先想到的是找到唯一的值,在找到匹配项之前循环这些值,然后查看匹配的唯一值,直到找到与这些值匹配的值,依此类推。但我确信有一种更简单的方法。

2 个答案:

答案 0 :(得分:1)

试试这个:

def find_groups(pairs):
    groups_list = list()
    for pair in pairs:
        s = ab = set(pair)
        for t in groups_list[:]: # we need to use copy
            if t & ab:           # check t include a, b
                s |= t
                groups_list.remove(t)
        groups_list.append(s)    # only s include a, b
    return groups_list

find_groups(pairs)

答案 1 :(得分:1)

免责声明:我不确定我是否理解正确。

在您的示例[col_147,col_141,col_319]中应该配对,但我找不到col_147col_141

之间的直接关联

因此,如果与col_319的共享连接已足以进行分组,则以下代码是错误的。

另一方面,如果你正在寻找团体,每个项目都与彼此的项目有直接联系,那么你就是:

from collections import defaultdict

connections = defaultdict(set)
for pair in array:
    connections[pair[0]].update(pair)
    connections[pair[1]].update(pair)

groups = set()
for others in connections.values():
    relations = [others] + [connections[o] for o in others]
    intersection = set.intersection(*relations)
    if len(intersection) > 2:
        groups.add(frozenset(intersection))

for group in groups:
    print(group)

输出:

frozenset({'col_312', 'col_142', 'col_319', 'col_148', 'col_316'})
frozenset({'col_76', 'col_184', 'col_165'})
frozenset({'col_312', 'col_316', 'col_141'})
frozenset({'col_149', 'col_317', 'col_311', 'col_313'})
frozenset({'col_165', 'col_75', 'col_184'})
frozenset({'col_315', 'col_313', 'col_317', 'col_143'})
frozenset({'col_312', 'col_147', 'col_316'})