创建意外的元组值

Creation of unexpected tuple value

我正在处理一个有点神秘的问题,希望得到一些澄清。我写了一个脚本来查找骰子掷骰组合加 24,如下所示:

start=[3,3,3,3,3,3,3,3]
outcomes=set(tuple(start)) #Use a set to ensure uniqueness

index_list=np.random.randint(0,8,1000)

#This little snippet adds one and subtracts one randomly, keeping total at 24
for i in xrange(0,500):
    upper=index_list[i]
    downer=index_list[i+20]

    if start[upper]!=6 and start[downer]!=1:
        start[upper]=start[upper]+1
        start[downer]=start[downer]-1
        outcomes.add(tuple(start))

print outcomes

我 运行 喜欢的是,当我查看结果时,那里有一个 'int' 类型的 3。

set([(4, 4, 4, 3, 2, 2, 2, 3), 3, (2, 5, 4, 3, 1, 4, 2, 3), (4, 4, 4, 2, 3, 1, 3, 3),(4, 2, 5, 2, 3, 4, 1, 3)])

虽然我当然可以删除它,但我只是好奇它是如何进入那里的?我最初的猜测是索引列表可能会生成 [0-7] 之外的索引,但事实并非如此。我在其他地方寻找过类似的问题,但尚未找到类似的问题。谢谢!

set 需要一个可迭代对象。您正在传递一个 tuple ,它是一个可迭代的。 set 遍历它,只留下 1 个值:3(因为你的元组只包含相同的 3 个值)。

您必须将您的元素放在列表或元组中,以便它被视为单个元素(当您传递一个字符串并且它被意外迭代时,完全相同的问题)

你的其余代码没有问题,与问题无关。

改为这样做:

outcomes=set([tuple(start),])

现在 set 遍历 1 个元组的列表,有效地创建 tuple 个元素。

你也可以这样做,也许更简单:

outcomes=set()
outcomes.add(tuple(start))

没有歧义,因为您要添加 1 个元素。没有遍历。