【问题标题】:What is the best practice to add tuples to a set?将元组添加到集合中的最佳实践是什么?
【发布时间】:2013-10-24 10:03:57
【问题描述】:

考虑这个例子:

In [44]: exl_set = set(a.node)
In [45]: exl_set 
Out[45]: set(['1456030', '-9221969'])
In [46]: exl_set.add(b.node)
In [47]: exl_set
Out[47]: set(['1456030', ('-9227619', '1458170'), '-9221969'])

将长度为 2 的 tuples 添加到 set 而不将它们与第一个 add 分开的最佳方法是什么?结果应如下所示:

Out[48]: set([ ('-9221969','1456030'),('-9227619', '1458170')])

【问题讨论】:

    标签: python set add data-consistency


    【解决方案1】:

    将初始节点包装在列表或元组中:

    exl_set = set([a.node])
    

    不要将其解释为一系列值。

    set() 构造函数将参数解释为一个可迭代对象,并将该可迭代对象中的所有值添加到集合中;来自the documentation

    set([iterable])
    返回一个新的 set 或 freezeset 对象,其元素取自 iterable

    演示:

    >>> node = ('1456030', '-9221969')
    >>> set(node)
    set(['1456030', '-9221969'])
    >>> set([node])
    set([('1456030', '-9221969')])
    >>> len(set([node]))
    1
    

    或者,创建一个空集并专门使用set.add()

    exl_set = set()
    exl_set.add(a.node)
    exl_set.add(b.node)
    

    【讨论】:

    • 谢谢!好吧,我当然想过这个。但这意味着我必须跟踪我的迭代。认为可能有更好的方法......
    • 最后一条信息就是我要找的!太好了,谢谢!
    • 很高兴能帮上忙!
    • @LarsVegas:带外评论:您个人资料上的职业 URL 是您个人资料的私人编辑 URL,只有您可以看到。您想改用public URL for your profile
    • 顺便说一句,如果您可以在创建列表或元组之间进行选择 - 选择元组,即使用 set([node]) 而不是 set([node])。在这种特殊情况下,每次添加速度大约快 25% - 231 ns 与 304 ns。
    【解决方案2】:

    初始化集合时,参数被视为iterable,而不是单个项目。你可以这样做:

        >>>node = (1, 3)
        >>>node_set = set([node,]) #  initialize a set with a single ilement
        >>>node_set
        set([(1, 3)])
    

    或者:

        >>>node = (1, 4)
        >>>node_set = set()  # initialize an empty set
        >>>node_set.add(node)  # add a single element
        >>>node_set
        set([(1, 4)])
    

    【讨论】:

      【解决方案3】:

      要为其他时间旅行者更新此答案,另一种方法是使用集合文字,这样可以节省先前答案的不必要的包装/展开过程:

      node = (1, 2)
      n_set = {node}
      n_set
      

      输出[17]:{(1, 2)}

      【讨论】:

        猜你喜欢
        • 2020-11-03
        • 1970-01-01
        • 2019-01-25
        • 1970-01-01
        • 2012-12-12
        • 2022-10-24
        • 2011-05-01
        • 2012-08-19
        • 1970-01-01
        相关资源
        最近更新 更多