在循环中使用Python的集合
我在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])]