在循环中使用Python中的set

时间:2010-03-25 21:53:27

标签: python dataset

我在Python中有以下列表:

[[1, 2], [3, 4], [4, 6], [2, 7], [3, 9]]

我想将它们分组到[[1,2,7],[3,4,6,9]]

我这样做的代码如下:

l=[[1, 2], [3, 4], [4, 6], [2, 7], [3, 9]]
lf=[]
for li in l:
    for lfi in lf:
        if lfi.intersection(set(li)):
            lfi=lfi.union(set(li))
            break
    else:
        lf.append(set(li))

我是我的最终名单。我在l和lf上做了一个循环,当我找到l和lf中的另一个元素之间的交集时,我想合并它们(union)

但我无法弄清楚为什么这不起作用。列表l的第一个元素正在使用append命令插入,但联合不起作用。 我的最终列表看起来像[set([1, 2]), set([3, 4])]

这似乎是非常基本的东西,但我不熟悉套装。 我感谢任何帮助

由于

3 个答案:

答案 0 :(得分:5)

问题在于:

lfi=lfi.union(set(li))

您没有修改该集。您正在创建一个新集合,然后将其丢弃。原始集仍在lf数组中。改为使用更新:

lfi.update(li)

这会修改原始集而不是创建新集。进行此更改后的结果:

[set([1, 2, 7]), set([9, 3, 4, 6])]

答案 1 :(得分:2)

这是写同一件事的另一种方式
对于集合,
 &表示intersection
 |=表示update

我还使用了map(set,l),因此您不会一遍又一遍地重新创建相同的设置

l=[[1, 2], [3, 4], [4, 6], [2, 7], [3, 9]]
lf=[]
for li in map(set,l):
    for lfi in lf:
        if lfi & li:
            lfi |= li
            break
    else:
        lf.append(li)

答案 2 :(得分:0)

l=[[1, 2], [3, 4], [4, 6], [2, 7], [3, 9]]
lf=[]
for li in l:
    for i, lfi in enumerate(lf):

        if lfi.intersection(set(li)):
            lfi=lfi.union(set(li))            
            lf[i] = lfi #You forgot to update the list
            break
    else:
        lf.append(set(li))