为了更好地理解,我正在尝试枚举在计算四个玩家的Banzhaf power indices时可能发生的独特情况,当没有独裁者并且有四个或五个获胜联盟时。我正在使用以下代码生成一组列表以进行迭代。
然而,如果两个列表在重新映射下是等价的,那么这个集合中的两个列表不应被视为唯一的。
以以下列表为例:
如果将每个元素
每个子列表中的顺序都不重要,子列表的顺序也不重要。因此,交换后的列表可以重新编写为:
有4个值,因此可能发生P(4,4)=24种可能的重映射(包括平凡映射)。
有没有简单的方法来轻松检查这一点?或者更好的是,有没有避免生成这些列表的方法?
我甚至不确定如何将第一个列表转换为第二个列表(但可以从那里进行蛮力)。另外,我在数据类型上没有限制(在某种程度上),使用frozenset也可以。
编辑:tobias_k提供的解决方案回答了“检查”问题,但正如评论中所指出的那样,我认为我对这个问题的方法是错误的。
from itertools import chain, combinations
def powerset(iterable):
s = list(iterable)
return chain.from_iterable(map(list, combinations(s, r)) for r in range(2, len(s)+1))
def superpowerset(iterable):
s = powerset(iterable)
return chain.from_iterable(map(list, combinations(s, r)) for r in range(4, 6))
set_of_lists = superpowerset([1,2,3,4])
然而,如果两个列表在重新映射下是等价的,那么这个集合中的两个列表不应被视为唯一的。
以以下列表为例:
[[1, 2], [1, 3], [2, 3], [1, 2, 4]]
如果将每个元素
2
重命名为3
,反之亦然,则会得到:[[1, 3], [1, 2], [3, 2], [1, 3, 4]]
每个子列表中的顺序都不重要,子列表的顺序也不重要。因此,交换后的列表可以重新编写为:
[[1, 2], [1, 3], [2, 3], [1, 3, 4]]
有4个值,因此可能发生P(4,4)=24种可能的重映射(包括平凡映射)。
有没有简单的方法来轻松检查这一点?或者更好的是,有没有避免生成这些列表的方法?
我甚至不确定如何将第一个列表转换为第二个列表(但可以从那里进行蛮力)。另外,我在数据类型上没有限制(在某种程度上),使用frozenset也可以。
编辑:tobias_k提供的解决方案回答了“检查”问题,但正如评论中所指出的那样,我认为我对这个问题的方法是错误的。
set
对象而不是list
对象。还可以有一组集合。 - Alfredo Gimenezfrozenset
。 - Jared Goguen[[1, 2], [1, 2, 3, 4]]
(缺少[[1, 2, 3]]
和[[1, 2, 4]]
)? - David Eisenstat