添加到集合中时,字符串分成单个字符

时间:2018-10-23 21:16:23

标签: python python-3.x

我有这种格式的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"]

4 个答案:

答案 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.updateset.add对应set.updatelist.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_langssset的地方。