当新的字符串被添加时,将单个字符串转换为字符串列表

3
我找不到答案。 我从文件中读取了一个字典,它有一个字符串值作为键。 然后我检查新值是否已经在字典中,如果没有,我想将其附加到先前的字符串并获取给定键的值列表。
例如,如果我有一个字典:
dict = {"vehicles": "car", "animals": "cat"}

以下条件为真。
if "dog" not in dict["animals"]:

我想要获取输出。
dict = {"vehicles": "car", "animals": ["cat", "dog"] }

6
以下是一些小贴士。字典是无序的,这意味着它们不会存储键的位置。此外,使用dict作为变量名是一个坏主意,因为dict是字典类。 - Qwerty
@Qwerty,对于Python中的json类型是真的吗? - James Flash
如果您想要排序,我相信您正在寻找一个有序字典,而我认为这个字典在collections库中。 - Qwerty
这是有价值的评论,谢谢。 - James Flash
5个回答

4

从一个字典开始,其值为字符串的set

d = {"vehicles": {"car"}, "animals": {"cat"}}

然后,添加两次新值只会添加一次(并且查找速度很快,因为它使用哈希):

d["animals"].add('dog')
d["animals"].add('dog')

>>> d
{'animals': {'dog', 'cat'}, 'vehicles': {'car'}}

如果您有像问题中那样的字典作为输入,您可以使用字典推导式将其与值一起轻松转换为集合,如下所示:
loaded_d = {"vehicles": "car", "animals": "cat"}  # dict just loaded from file
d = {key:{value} for key,value in loaded_d.items()}

好的,当我从文件中读取字典时,我应该将值转换为集合吗? - James Flash

1
你只需要使用append方法更新动物列表即可。
dict = {"vehicles": "car", "animals": "cat"}

def appendItem(item):
  if item not in dict["animals"]:
      if not isinstance(dict["animals"], list):
          dict["animals"] = [dict["animals"]]
      dict["animals"].append(item)

appendItem("dog")
appendItem("dog")
appendItem("rabbit")
appendItem("cat")

输出

=> {'vehicles': 'car', 'animals': ['cat', 'dog', 'rabbit']}

1
>>> if "dog" not in dict["animals"]:
...     dict["animals"] = [dict["animals"], "dog"]

3
请尝试添加第三种动物,使其能够再次嵌套在您的列表中。 - Jean-François Fabre
这不在问题陈述中。 - Jonathan R
谢谢。是的,像Jean-François Fabre注意到的那样,附加更多的字符串并获得字符串列表会很好。 - James Flash

1
另一种方法是尝试将元素附加到列表中,如果失败,则将字典值设置为列表:
dic = {"vehicles": "car", "animals": "cat"}
if "dog" not in dic["animals"]:
    try:
        dic["animals"].append("dog")
    except:
        dic["animals"] = [dic["animals"], "dog"]

给出输出:

{'vehicles': 'car', 'animals': ['cat', 'dog']}

如果你只有一个元素,那么except部分将会被执行,使得该值成为一个字符串列表。如果你想要添加另一个元素,它将会被追加到列表中。

谢谢,但对我来说它给出了 {'vehicles': 'car', 'animals': [['cat'], 'dog']}。 - James Flash
是的,它有效,与Jonathan R的答案有什么区别?这是由于异常吗?为什么在这里append()适用于字符串? - James Flash
1
如果你添加多个项目,Jonathan的答案将会产生嵌套列表。但是在这里不会。append不能用于字符串,它会抛出异常,因此需要使用try/except - toti08

1
应该是我认为最简单的方式。
dict = {"vehicles": {"car"}, "animals": {"cat"}}
if "dog" not in dict["animals"]:
    dict["animals"].add("dog")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接