【问题标题】:string breaks into single characters when added to a set字符串添加到集合时会分解为单个字符
【发布时间】:2019-03-28 05:13:49
【问题描述】:

我有一个这种格式的json文件,

d = {
  "allowed_langs": [{
      "langs": ["java", "golang", "python"]
    },
    {
      "langs": ["java", "golang", "csharp"]
    },
  ]
}

我想要的输出是制作一个包含所有唯一 langs 的语言列表,

所需的输出,

languages = ["java", "golang", "python", "csharp"]

首先我创建了一个空集,

allowed_languages = set()

我尝试使用嵌套循环来做到这一点,

for allowed_langss in d["allowed_langs"]:
    for each in allowed_langss["langs"]:
        allowed_languages.update(each)

但是当我打印它时,我得到了这个,

print(allowed_languages)

输出,

{'t', 'j', 'g', 'h', 'r', 'o', 'y', 'c', 'v', 'n', 'p', 'l', 'a', 's'}

谁能告诉我为什么它会分解成字符?

我也试过list comprehension

print([lang for lang in d['allowed_langs']])

但这给了我,

[{'langs': ['java', 'golang', 'python']}, {'langs': ['java', 'golang', 'csharp']}]

虽然我想要的输出是,

所需的输出,

languages = ["java", "golang", "python", "csharp"]

【问题讨论】:

    标签: python python-3.x


    【解决方案1】:

    谁能告诉我为什么它会分解成字符?

    set.update() 接受一个迭代器并通过迭代它来添加所有元素。当您传递一个str,它是一个字符列表时,您实际上是在将一个迭代器传递给一个字符列表。所以它只是迭代它并将所有字符添加到自我。

    所以你想要的是:

    for allowed_langss in d["allowed_langs"]: 
       for each in allowed_langss["langs"]:
          allowed_languages.add(each)
    

    或者

    for allowed_langss in d["allowed_langs"]: 
       allowed_languages.update(allowed_langss["langs"])
    

    其中allowed_langssset

    【讨论】:

      【解决方案2】:

      您可以使用嵌套集合推导:

      d = {'allowed_langs': [{'langs': ['java', 'golang', 'python']}, {'langs': ['java', 'golang', 'csharp']}]}
      new_d = list({i for b in d['allowed_langs'] for i in b.get('langs', [])})
      

      输出:

      ['java', 'python', 'golang', 'csharp']
      

      【讨论】:

      • 谢谢。有没有办法在将 langs 键添加到列表之前检查它是否存在?因为我的实际 json 文件很大,其中一些完全丢失了"langs": ["java", "golang", "csharp"]
      • @MaverickD 请看我最近的编辑。我添加了b.get('langs', []) 来代替b['langs'],这样如果"langs" 键丢失,则会迭代一个空列表,而不影响最终结果。
      【解决方案3】:

      只需更改代码的更新部分(第 3 行)。

      for allowed_langss in d["allowed_langs"]:
          for each in allowed_langss["langs"]:
              allowed_languages.update({each})
      

      Python 的 set.update 将字符串拆分为其组成字符。 你可以通过让 python 将一个集合添加到现有集合来克服这个问题。

      如果您希望将集合作为列表:

      [i for i in allowed_languages]
      

      来源:How to use Python sets and add strings to it in as a dictionary value

      【讨论】:

        【解决方案4】:

        使用set.add 代替set.updateset.addset.update 就像 list.appendlist.extend

        set.add 将单个元素添加到集合中,set.update 将可迭代对象作为参数并在该可迭代对象中添加每个元素。字符串是可迭代的,其中元素是单个字符...

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多