【问题标题】:Convert specific json values as dictionary values in python将特定的json值转换为python中的字典值
【发布时间】:2022-01-16 12:44:03
【问题描述】:

这是我的示例 JSON 文件。

[
 {
  "Sl No.": 1,
  "Questions": "Who is known as ‘Father of computers’?",
  "Option A": "A.Vannevar Bush",
  "Option B": "B.Charles Babbage",
  "Option C": "C.Howard Aiken",
  "Option D": "D.John Atansoff",
  "Answers": "Charles Babbage",
  "Level" : 2
 },
 {
  "Sl No.": 2,
  "Questions": "Which among the following has low speed storage?",
  "Option A": "A.CD-ROM",
  "Option B": "B.Extended storage",
  "Option C": "C.Magnetic disks",
  "Option D": "D.Magnetic tapes",
  "Answers": "Magnetic tapes",
   "Level" : 1
 }
]

我正在尝试将它转换成一个 python 字典,它应该有这样的问答对:

dic ={"Who is known as ‘Father of computers’?": "Charles Babbage","Which among the following has low speed storage?": "Magnetic tapes" }

到目前为止,我正在使用这种方法转换为字典:

json_file = open("import.json")
data = json.load(json_file)

questions = []
answers = []


for i in range(len(data)):
    questions.append(data[i]["question"])
for i in range(len(data)):
    answers.append(data[i]["answer"])

easy = dict(zip(questions, answers))

在这里,我正在遍历 JSON 文件以查找问题和答案值并将它们附加到一个空列表中。然后我使用 zip 函数将这两个列表转换为字典。我知道这不是一个非常优化的方法,并且随着我的应用程序扩展,我必须创建多个字典,我必须为每个字典创建 2 个列表,然后再次压缩。有没有更简单更好的方法? 谢谢

【问题讨论】:

    标签: python list dictionary


    【解决方案1】:

    您可以在此处使用字典推导式。在那里,您迭代一个可迭代对象并用冒号分隔键值对。这将为您生成字典。在代码中,读起来像

    result = {d["Questions"] : d["Answers"] for d in data}
    

    请注意,我使用的是示例中所示的键,而不是您的代码中使用的键。

    【讨论】:

      【解决方案2】:

      如果QuestionsAnswers不存在,使用get不会抛出错误,您可以通过get中的第二个参数返回that value以防任何问题或答案键不存在

      final = {each_item.get('Questions'): each_item.get('Answers') for each_item in my_list}
      

      【讨论】:

        【解决方案3】:

        到达那里的方式有点迂回,但在 Python 3.8+ 中,您还可以使用 walrus := 语法结合简单的 dict 理解:

        data = [
         {
          "Sl No.": 1,
          "Questions": "Who is known as ‘Father of computers’?",
          "Option A": "A.Vannevar Bush",
          "Option B": "B.Charles Babbage",
          "Option C": "C.Howard Aiken",
          "Option D": "D.John Atansoff",
          "Answers": "Charles Babbage",
          "Level" : 2
         },
         {
          "Sl No.": 2,
          "Questions": "Which among the following has low speed storage?",
          "Option A": "A.CD-ROM",
          "Option B": "B.Extended storage",
          "Option C": "C.Magnetic disks",
          "Option D": "D.Magnetic tapes",
          "Answers": "Magnetic tapes",
           "Level" : 1
         }
        ]
        
        result = {(v := list(d.values()))[1]: v[v[0] + 2].split('.', 1)[-1]
                  for d in data}
        
        print(result)
        

        当然,这最终可能会变得非常低效。如果您想避免在脚上开枪,最好使用最简单、最优雅的解决方案:

        result = {d['Questions']: d['Answers'] for d in data}
        

        输出:

        {'Who is known as ‘Father of computers’?': 'Charles Babbage', 'Which among the following has low speed storage?': 'Magnetic disks'}
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-08-12
          • 2011-03-13
          • 1970-01-01
          • 1970-01-01
          • 2015-01-14
          • 2011-01-29
          • 2022-11-14
          • 2013-09-23
          相关资源
          最近更新 更多