【问题标题】:how to create a list of dictionaries using python如何使用python创建字典列表
【发布时间】:2018-09-17 10:18:48
【问题描述】:

我有一个函数,它返回一个列表,我在该列表中序列化为一个 json 对象并将其写入一个 JSON 文件。

结果是正确的,但问题是它返回了分隔列表中的每条记录。

我想要的是返回一个包含多个字典项的列表。

示例:

返回结果:

[{"file Name": "test1.txt", "searched Word": "th", "number of occurence": 1}][{"file Name": "test2.txt", "searched Word": "th", "number of occurence": 1}]

预期结果

[
 {
   "file Name": "test1.txt",
   "searched Word": "th", 
   "number of occurence": 1
  }
  {
   "file Name": "test2.txt",
   "searched Word": "th",
   "number of occurence": 1
  }
 ]

我怎样才能做到这一点?

代码:

    for counter, myLine in enumerate(textList):
                thematch=re.sub(searchedSTR,RepX,myLine)
                matches = re.findall(searchedSTR, myLine, re.MULTILINE | re.IGNORECASE)


                if len(matches) > 0:  

                    # add one record for the match (add one because line numbers start with 1)
                    d[matches[0]].append(counter + 1)
                self.textEdit_PDFpreview.insertHtml(str(thematch))
                '''
                loop over the selected file and extract 3 values:
                ==> name of file 
                ==> searched expression
                ==> number of occurence 
                '''
listMetaData=[]
                for match, positions in d.items():
                    listMetaData.append({"file Name":fileName,"searched Word":match,"number of occurence":len(positions)})
                jsondata = json.dumps(listMetaData)
                print(jsondata)

【问题讨论】:

  • 在我看来,您返回的和预期的结果中缺少几个“,”?
  • json dumps 从 dict 返回一个表示 json 对象的字符串。
  • 你能分享一下传递给第一个for循环的变量textList的值吗
  • @iam.Carrot 值为with open(currentFile) as ctf: ctfRead = ctf.read() textList = ctfRead.split('\n')

标签: python json list loops dictionary


【解决方案1】:

您可以通过更改保存数据的方式来更改此设置:

listMetaData = []
for match, positions in d.items():
    listMetaData.append({"file Name":fileName,"searched Word":match,"number of occurence":len(positions)})
jsondata = json.dumps(listMetaData)
print(jsondata)

这样你就省钱了

 [{dict: 1}, {dict: 2}]

代替

[{dict:1}] [{dict: 2}]

【讨论】:

    【解决方案2】:

    您的代码会立即创建一个列表,然后打印每个列表。您的问题不清楚您到底想要什么,但我相信您想要一个所有元数据对象的列表。您可以通过更改代码来做到这一点:

    for match, positions in d.items():
                listMetaData = [{"file Name":fileName,"searched Word":match,"number of occurence":len(positions)}]
                jsondata = json.dumps(listMetaData)
                print(jsondata)
    

    all_metadata = []
    for match, positions in d.items():
        meta_data = {"file Name":fileName,"searched Word":match,"number of occurence":len(positions)}
        all_metadata.append(meta_data)
    
    json_data = json.dumps(all_metadata)
    print(json_data)
    return json_data
    

    请注意,python 不打算对变量使用驼峰式大小写,而是蛇形大小写。此外,缩进应该有 4 个空格(或一个制表符),而不是 10 个空格。

    【讨论】:

    • 我试过你的答案,但仍然得到相同的结果 ==> 多个列表
    • 那你做错了什么。如果您希望更好地格式化字符串,请将@​​987654323@ 作为参数添加到 json.dumps
    • 我尝试添加缩进 =4 它仍然是一个包含多个列表的文件的相同结果,其中每个列表处理一个字典....我想要的是一个包含一个列表的文件处理多个字典。
    【解决方案3】:

    您可以像 new_list = list_1 + list_2 一样将您的列表合并在一起

    【讨论】:

      【解决方案4】:

      又快又脏:

      您需要在任何for 循环之前创建输出列表,从listMetaData 变量中删除括号,将listMetaData 附加到输出列表,并将json.dumps 移动到for 循环下方。

      解释:

      所以,您想创建一个 listdictionaries。这意味着您需要一个列表来放入任何字典。

      您的代码中当前发生的情况是,您正在为每个匹配项创建一个列表,使用方括号。

      for match, positions in d.items():
              listMetaData = [{"file Name":fileName,"searched Word":match,"number of occurence":len(positions)}]
              jsondata = json.dumps(listMetaData)
              print(jsondata)
      

      在启动forloop 之前尝试将列表存储在变量中。然后对结果列表进行 json 转储。

      output_list = []
      for match, positions in d.items():
          listMetaData = {"key": value, etc..}
          output_list.append(listMetaData)
      jsondata = json.dumps(output_list)
      print(jsondata)
      

      【讨论】:

      • 我试过了,但结果还是一样listMetaData=[] for match, positions in d.items(): listMetaData.append({"file Name":fileName,"searched Word":match,"number of occurence":len(positions)}) jsondata = json.dumps(listMetaData) print(jsondata)
      • 还是没有成功解决问题
      【解决方案5】:

      这里是将多个字典列表转换为单个字典列表的示例代码。

      我假设你的 json 有逗号分隔,即每个列表之间有逗号。

      [{"file Name": "test1.txt", "searched Word": "th", "number of occurence": 1}],[{"file Name": "test2.txt", "searched Word": "th", "number of occurence": 1}]
      

      示例代码:

      myDict = []
      myJsonvar = [{"file Name": "test1.txt", "searched Word": "th", "number of occurence": 1}],[{"file Name": "test2.txt", "searched Word": "th", "number of occurence": 1}]
      
      for idx,jstrings in enumerate(myJsonvar) :
          for inx, elem in enumerate(jstrings) :
              myDict.append(myJsonvar[idx][inx])
      
      print(myDict)
      

      输出:

      [{'file Name': 'test1.txt', 'searched Word': 'th', 'number of occurence': 1}, {'file Name': 'test2.txt', 'searched Word': 'th', 'number of occurence': 1}]
      

      此输出也将是逗号分隔的单个列表字典。

      其他方法: 如果您不想制作字典列表或在列表之间添加逗号。

      你可以试试这个代码:

      import re
      
      import yaml
      
      
      myListOfDict = []
      myJsonvar = '[{"file Name": "test1.txt", "searched Word": "th", "number of occurence": 1}][{"file Name": "test2.txt", "searched Word": "th", "number of occurence": 1}]'
      
      mylist = myJsonvar.split("][")
      
      for lst in mylist :
          updateVar = re.sub(r'[\[\]]', '',lst)
          myListOfDict.append(yaml.load(updateVar))
      
      print(myListOfDict)
      

      输出

      [{'file Name': 'test1.txt', 'searched Word': 'th', 'number of occurence': 1}, {'file Name': 'test2.txt', 'searched Word': 'th', 'number of occurence': 1}] 
      

      希望对你有帮助

      【讨论】:

      【解决方案6】:
      [dict1, dict2]
      

      您可以将常用的列表语法与逗号分隔的对象一起使用,其中对象恰好是字典。

      【讨论】:

      • 列表将包含 dict1 ==> [{"file Name": "test1.txt", "searched Word": "th", "number of occurence": 1} dict2 ==> {"file Name": "test2.txt", "searched Word": "th", "number of occurence": 1}]
      猜你喜欢
      • 2016-01-08
      • 2021-04-02
      • 2022-11-18
      • 2018-05-18
      • 2021-06-16
      • 2023-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多