我有这种格式的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"]
答案 0 :(得分:4)
您可以使用嵌套的集合理解:
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']
答案 1 :(得分:2)
使用set.add
代替set.update
。 set.add
对应set.update
,list.append
对应list.extend
。
set.add
将一个元素添加到集合中,set.update
将一个iterable用作参数,并在该iterable中添加每个元素。字符串是可迭代的,其中元素是单个字符...
答案 2 :(得分:1)
只需更改代码的更新部分(第三行)即可。
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
答案 3 :(得分:0)
有人可以告诉我为什么它会分成字符吗?
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_langss
是set
的地方。