【问题标题】:Append values to a set in Python将值附加到 Python 中的集合
【发布时间】:2011-03-24 11:16:53
【问题描述】:

我有一套这样的:

keep = set(generic_drugs_mapping[drug] for drug in drug_input)

如何将值 [0,1,2,3,4,5,6,7,8,9,10] 添加到此集合中?

【问题讨论】:

    标签: python set append


    【解决方案1】:

    定义集合

    a = set()
    

    使用 add 附加单个值

    a.add(1)
    a.add(2)
    

    使用更新从元组、集合、列表或冻结集合中添加元素

    a.update([3,4])
    
    >> print(a)
    {1, 2, 3, 4}
    

    如果要添加元组或冻结集本身,请使用 add

    a.add((5, 6))
    
    >> print(a)
    {1, 2, 3, 4, (5, 6)}
    

    注意:由于集合元素必须是可散列的,并且列表被认为是可变的,因此您不能将列表添加到集合中。您也不能将其他集添加到集。但是,您可以按照“.update”方法的演示从列表和集合中添加元素。

    【讨论】:

      【解决方案2】:

      我喜欢这样做的方式是将原始集合和我想添加的值转换为列表,添加它们,然后将它们转换回集合,如下所示:

      setMenu = {"Eggs", "Bacon"}
      print(setMenu)
      > {'Bacon', 'Eggs'}
      setMenu = set(list(setMenu) + list({"Spam"}))
      print(setMenu)
      > {'Bacon', 'Spam', 'Eggs'}
      setAdditions = {"Lobster", "Sausage"}
      setMenu = set(list(setMenu) + list(setAdditions))
      print(setMenu)
      > {'Lobster', 'Spam', 'Eggs', 'Sausage', 'Bacon'}
      

      通过这种方式,我还可以使用相同的逻辑轻松添加多个集合,如果我尝试使用 .update() 方法进行操作,我会得到一个 TypeError: unhashable type: 'set'

      【讨论】:

      • 转换到列表并返回是很多不必要的开销,并且似乎违背了集合的目的。考虑@nyuszika7h 的答案以及 cmets 中的解决方案(此处复制错误):big_set = my_sets[0].union(*my_sets[1:])
      【解决方案3】:
      keep.update((0,1,2,3,4,5,6,7,8,9,10))
      

      或者

      keep.update(np.arange(11))
      

      【讨论】:

      • 您的答案与@sberry 的现有答案相比没有改进,该答案比您的答案早 9 年发布。
      【解决方案4】:

      对我来说,在 Python 3 中,它的工作方式很简单:

      keep = keep.union((0,1,2,3,4,5,6,7,8,9,10))
      

      不知道对不对……

      【讨论】:

        【解决方案5】:

        您还可以使用| 运算符连接两个集合(集合论中的联合):

        >>> my_set = {1}
        >>> my_set = my_set | {2}
        >>> my_set
        {1, 2}
        

        或者使用|=的更短形式:

        >>> my_set = {1}
        >>> my_set |= {2}
        >>> my_set
        {1, 2}
        

        注意:在 Python 2.7 之前的版本中,使用 set([...]) 而不是 {...}

        【讨论】:

        • 如果你有一个集合列表my_sets,那么你可以用big_set = my_sets[0].union(*my_sets[1:])把它们全部组合起来
        【解决方案6】:

        这个问题是第一个出现在 Google 上的问题,当人们查找“Python 如何将元素添加到集合”时,因此值得注意的是,如果你想将整个字符串添加到集合中,它应该是添加.add(),而不是.update()

        假设您有一个字符串foo_str,其内容为'this is a sentence',并且您有一些集合bar_set 等于set()

        如果你这样做 bar_set.update(foo_str),你设置的内容将是{'t', 'a', ' ', 'e', 's', 'n', 'h', 'c', 'i'}

        如果您使用bar_set.add(foo_str),则您的集合的内容将为{'this is a sentence'}

        【讨论】:

        • 赞成,以澄清整个画面。
        【解决方案7】:

        像这样使用update

        keep.update(newvalues)
        

        【讨论】:

          【解决方案8】:
          keep.update(yoursequenceofvalues)
          

          例如,keep.update(xrange(11)) 用于您的具体示例。或者,如果您出于某种原因必须在循环中生成值,

          for ...whatever...:
            onemorevalue = ...whatever...
            keep.add(onemorevalue)
          

          当然,如果可行的话,通过单个 .update 调用批量执行此操作会更快、更方便。

          【讨论】:

          • .add 添加单个项目,.update 添加多个项目。对吗?
          • @ThorSummoner 是的,.add 需要一个可散列类型,而 .update 需要一个可迭代对象
          • 如果你添加一个带有更新的字符串,它会在你的字符串中为每个字符添加一个项目,因为它是一个可迭代的!
          • 确实需要注意,作为“整体”对象的字符串应该添加.add,而不是.update,由于这个小细节,我最近遇到了一个相当狡猾的错误。
          • addupdate改变set对象,可以调用{*a, *b}返回一个新的set对象
          猜你喜欢
          • 1970-01-01
          • 2011-06-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-07-18
          • 1970-01-01
          • 2013-01-10
          • 2021-12-21
          相关资源
          最近更新 更多