【问题标题】:Creation of unexpected tuple value创建意外的元组值
【发布时间】:2016-10-28 16:04:09
【问题描述】:

我正在处理一些谜团,并希望得到一些澄清。我编写了一个脚本,用于查找添加到 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

我遇到的是,当我查看结果时,里面只有一个 3 类型的“int”。

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] 之外的索引,但事实并非如此。我在其他地方寻找过类似的问题,但还没有找到类似的问题。谢谢!

【问题讨论】:

    标签: python-2.7 set tuples add


    【解决方案1】:

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

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

    你的其余代码都可以,与问题无关。

    改为这样做:

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

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

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

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

    没有歧义,因为您添加了 1 个元素。它没有被迭代。

    【讨论】:

    • 啊,有道理!谁反对这个,你为什么这样做?这不是一种pythonic方式吗,还是有其他理由不赞成它?
    • 我正要评论否决票。有人误读了这个问题……我也不明白。
    • @MasonGardner 我没有投反对票,但我没有投赞成票的原因是我认为该解释有点误导/不明确。 set 确实期望可迭代,但 tuples are iterables - 这个答案听起来好像不是。您获得3 的原因是因为这是(3, 3, 3, 3, 3, 3, 3, 3) 中唯一的唯一值。
    • @elethan 我已经编辑了我的帖子,我认为它很容易理解(OP 一下子就明白了)。
    猜你喜欢
    • 2018-09-19
    • 1970-01-01
    • 2017-11-25
    • 2011-04-06
    • 2019-02-04
    • 2021-05-18
    • 2019-05-15
    • 1970-01-01
    • 2017-09-02
    相关资源
    最近更新 更多