检查返回的dict键是否导致列表

时间:2017-05-26 18:25:05

标签: python json list dictionary

我有一些Python代码,它从字典中返回两个随机密钥。

key1,key2 = random.sample(stories.keys(), 2)

问题是,字典stories还包含列表对象,我希望变量key1key2只包含字符串,而不是列表。

stories字典包含一堆列表。但是那些列表可以包含列表。所以它看起来像这样:

{ "thing1": [
         "Some text",
         "Other text"
             ],
  "thing2": [
         "Some numbers",
         "How about those 2?"
             ],
  "thing3": {
         "Something else": [
                          "More stuff",
                          "Even more stuff"
                           ]
            },
  "thing4": [
            "Even more data",
            "Yep, more data"
            ]
   }

那么如何在thing1thing2thing3thing4之间选择两个密钥,但却不能获得Something else

修改:为了澄清,我试图选择不包含列表的密钥。所以我只想在thing1thing2thing4中选择,而忽略thing3

我已经更新了数据示例以使事情更加清晰。

3 个答案:

答案 0 :(得分:1)

您可以过滤掉不需要的条目,如下所示:

dict((k,d[k]) for k in d if type(d[k]) == list and all(type(x) == str for x in d[k]))

或者,更好的是:

dict((k,d[k]) for k in d if isinstance(d[k],list) and all(isinstance(x,str) for x in d[k]))

答案 1 :(得分:0)

如果我理解正确,我认为你只想要单级列表,而不是嵌套列表。

您可以在生成这样的随机密钥时进行检查

if (stories[key][0] && isinstance(stories[key][0], list)):
  #get the next random key

答案 2 :(得分:0)

您的意思是从thing1thing2指向的字符串列表中选择密钥吗?也许这会让你更接近:

key_strings = (s for kv in stories.items() if isinstance(kv[1],list) for s in kv[1])
print(list(key_strings))

打印:

['Some numbers', 'How about those 2?', 'Some text', 'Other text']