Python使用random.sample构建无自环图时如何排除自身节点?
问题原因
你之前的代码报错核心是**list.remove()方法返回None**,而且这个方法是原地修改列表的——也就是说,你把glist.remove(node)传给rnd.sample时,其实传的是None,自然会报"NoneType不可迭代"的错误。另外,就算提前定义glist,循环里反复移除元素也会让后续节点的候选集越来越少,逻辑根本不对。
简洁实现方法
这里给两种简洁的写法,都能正确生成每个节点排除自身后的随机邻居:
方法1:列表推导式生成候选集
直接用列表推导式过滤掉当前节点,生成合法的候选邻居集合:
import random as rnd gsize = 5 graph = [rnd.sample([x for x in range(gsize) if x != node], rnd.randint(0, gsize-1)) for node in range(gsize)]
方法2:集合差集快速排除自身
利用集合的差集操作,快速得到排除当前节点的所有其他节点:
import random as rnd gsize = 5 graph = [rnd.sample(list(set(range(gsize)) - {node}), rnd.randint(0, gsize-1)) for node in range(gsize)]
两种方法都能保证每个节点的邻居列表里不会出现自身,且每次生成的候选集都是完整的所有其他节点,不会因为循环修改列表导致数据错误。
内容的提问来源于stack exchange,提问作者Soheil
相关产品推荐
相关产品推荐

