在循环中使用Python的集合

2 投票
3 回答
3814 浏览
提问于 2025-04-15 20:51

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

lf是我的最终列表。我在l和lf之间循环,当我发现l中的一个元素和lf中的另一个元素有交集时,我想把它们合并在一起(并集)

但是我搞不明白为什么这不管用。列表l中的前两个元素是用append命令添加的,但并集的操作没有成功。我的最终列表lf看起来像 [set([1, 2]), set([3, 4])]

这似乎是个很基础的问题,但我对集合不太熟悉。
我很感激任何帮助

谢谢

3 个回答

0

在编程中,有时候我们会遇到一些问题,比如代码运行不正常或者出现错误。这个时候,我们可以去一些技术论坛,比如StackOverflow,寻求帮助。在这些论坛上,很多人会分享他们的经验和解决方案。

例如,有人可能会问:“为什么我的代码总是出错?” 然后,其他人就会根据自己的经验,给出一些建议和解决方法。他们可能会建议检查代码的某个部分,或者提供一些示例代码,帮助你理解问题所在。

总之,技术论坛是一个很好的地方,可以让你学习到很多知识,解决编程中的各种问题。

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))
2

这里有另一种写法,效果是一样的。
对于集合来说,& 表示 交集,也就是找出两个集合中都有的元素。
|= 则表示 更新,也就是把新的元素加到集合里。

我还使用了 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)
5

问题出在这里:

lfi=lfi.union(set(li))

你并没有在修改这个集合,而是创建了一个新的集合,然后这个新集合就被丢掉了。原来的集合仍然在 lf 数组里。你应该使用更新的方法:

lfi.update(li)

这样可以直接修改原来的集合,而不是创建一个新的。做了这个修改后的结果是:

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

撰写回答