Python 将字符串添加到集合中时,字符串将拆分为单个字符
我有一个这种格式的json文件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"]
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”
键丢失的情况下,将迭代一个空列表,而不影响最终结果。