处理Python中的传递性

时间:2015-09-16 09:30:59

标签: python

我有成对关系这样的

col_combi = [('a','b'), ('b','c'), ('d','e'), ('l','j'), ('c','g'), 
             ('e','m'), ('m','z'), ('z','p'), ('t','k'), ('k', 'n'), 
             ('j','k')]

此类关系的数量足以单独检查。这些元组表示两个值都相同。我想申请传递性并找出共同的群体。输出如下:

[('a','b','c','g'), ('d','e','m','z','p'), ('t','k','n','l','j')]

我尝试了以下代码,但它有bug,

common_cols = []
common_group_count = 0

for (c1, c2) in col_combi:
    found = False
    for i in range(len(common_cols)):
        if (c1 in common_cols[i]):
            common_cols[i].append(c2)
            found = True
            break
        elif (c2 in common_cols[i]):
            common_cols[i].append(c1)
            found = True
            break
    if not found:
        common_cols.append([c1,c2])

以上代码的输出如下

[['a', 'b', 'c', 'g'], ['d', 'e', 'm', 'z', 'p'], ['l', 'j', 'k'], ['t', 'k', 'n']]

我知道为什么这段代码无效。所以我想知道如何执行此任务。

提前致谢

4 个答案:

答案 0 :(得分:8)

您可以使用NetworkX库将其作为图形问题处理:

import networkx

col_combi = [('a','b'), ('b','c'), ('d','e'), ('l','j'), ('c','g'), 
             ('e','m'), ('m','z'), ('z','p'), ('t','k'), ('k', 'n'), 
             ('j','k')]

g = networkx.Graph(col_combi)

for subgraph in networkx.connected_component_subgraphs(g):
    print subgraph.nodes()

输出:

['m', 'z', 'e', 'd', 'p']
['t', 'k', 'j', 'l', 'n']
['a', 'c', 'b', 'g']

答案 1 :(得分:3)

您可以使用grep和联合/交叉操作来实施解决方案。

itertools.combinations

输出:

{{1}}

注意:{{1}}

sets

答案 2 :(得分:1)

使用itertools的解决方案,你可以看看。

lst =[]
import itertools
for a, b in itertools.combinations(col_combi, 2):
    for i in a:
        if i in b:
            lst.append(set(a+b))



for indi,i in enumerate(lst):
    for j in lst:
        if i == j:
            continue
        if i & j:
            lst[indi] = i|j
            lst.remove(j)


print lst

输出是:

[set(['a', 'c', 'b', 'g']), set(['k', 'j', 'l', 'n']), set(['e', 'd', 'm', 'p', 'z'])]

当然,这可以提高效率。我会尽快更新。

答案 3 :(得分:0)

从elif之后的代码中你可以认为这种关系是反身的。 如果未按特定顺序提供对,则算法将失败。

示例:

(b, c) (a, b) (c, d)

最终会有两套

b, c, d

a, b

问题在于使用等价关系对集合进行分区。理解集合论背景有助于识别可以解决问题的库。请参阅https://en.m.wikipedia.org/wiki/Equivalence_relation