Python 将字符串添加到集合中时,字符串将拆分为单个字符

Python 将字符串添加到集合中时,字符串将拆分为单个字符,python,python-3.x,Python,Python 3.x,我有一个这种格式的json文件 d = { "allowed_langs": [{ "langs": ["java", "golang", "python"] }, { "langs": ["java", "golang", "csharp"] }, ] } 我想要的输出是制作一个单一的语言列表,其中包含所有唯一的langs 所需输出, languages = ["java", "golang", "python", "csharp"]

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

d = {
  "allowed_langs": [{
      "langs": ["java", "golang", "python"]
    },
    {
      "langs": ["java", "golang", "csharp"]
    },
  ]
}
我想要的输出是制作一个单一的语言列表,其中包含所有唯一的
langs

所需输出,

languages = ["java", "golang", "python", "csharp"]
{'t', 'j', 'g', 'h', 'r', 'o', 'y', 'c', 'v', 'n', 'p', 'l', 'a', 's'}
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)
输出,

languages = ["java", "golang", "python", "csharp"]
{'t', 'j', 'g', 'h', 'r', 'o', 'y', 'c', 'v', 'n', 'p', 'l', 'a', 's'}
languages = ["java", "golang", "python", "csharp"]
有人能告诉我为什么它会变成字符吗

我还尝试了
列表理解

print([lang for lang in d['allowed_langs']])
但这给了我

[{'langs': ['java', 'golang', 'python']}, {'langs': ['java', 'golang', 'csharp']}]
虽然我期望的输出是

所需输出,

languages = ["java", "golang", "python", "csharp"]
{'t', 'j', 'g', 'h', 'r', 'o', 'y', 'c', 'v', 'n', 'p', 'l', 'a', 's'}
languages = ["java", "golang", "python", "csharp"]

可以使用嵌套集:

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']

使用
set。添加
而不是
set。更新
<代码>设置。将
添加到
设置。将
更新为
列表。将
添加到
列表。扩展


set.add
将单个元素添加到集合中,
set.update
将一个iterable作为参数,并添加该iterable中的每个元素。字符串是一个iterable,其中元素是单个字符…

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

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

如果要将集合设置为列表,请执行以下操作:

[i for i in allowed_languages]
资料来源:

有人能告诉我为什么它会变成字符吗

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

所以你想要的是:

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


其中
allowed\u langss
是一个
集合

谢谢。在将键添加到列表之前,是否有方法检查是否存在
langs
键?因为我实际的json文件很大,其中一些缺少了
“langs”:[“java”、“golang”、“csharp”]
。@MaverickD请查看我最近的编辑。我添加了
b.get('langs',[])
来代替
b['langs']
,以便在
“langs”
键丢失的情况下,将迭代一个空列表,而不影响最终结果。