如何将列表列表转换为字典键值对 python

How to convert list of lists to dict key value pairs python

我有一个这样的列表:

splitted = [['OID:XXXXXXXXXXX1',
  ' street:THE ROAD',
  'town:NEVERPOOL',
  'postcode:M1 2DD',
  'Name:SOMEHWERE',
  'street:THE ROAD',
  'town:NEVERLAND',
  'postcode:M1 2DD'],
 ['OID:XXXXXXXXXXX2',
  ' Name:30',
  'street:DA PLACE',
  'town:PERTH',
  'postcode:PH1 2DD',
  'Name:30',
  'street:DA PLACE',
  'town:PERTH',
  'postcode:PH1 2DD']]

我想像这样将它们转换为键值对:

{'OID': 'XXXXXXXXXXX1', ' street': 'THE ROAD', 'town': 'NEVERPOOL', 'postcode': 'M1 2DD', 'Name': 'SOMEWHERE', 'street': 'THE ROAD', 'town': 'NEVERPOOL', 'postcode': 'M1 2DD'}, {'MPXN': 'XXXXXXXXXXX2', ' Name': '30', 'street': 'DA PLACE', 'town': 'PERTH', 'postcode': 'PH1 2DD', 'primaryName': '30', 'street1': 'DA PLACE', 'town': 'PERTH', 'postcode': 'PH1 2DD'} 

我无法在线找到一种方法将列表列表转换为键值对作为字典,然后由 pandas 使用。这样做的目的是将字典转换为 pandas DataFrame,这样我就可以使用它并以表格格式使用它

到目前为止我使用的代码在这里:

output = []
for list in splitted:
    for key_value in list:
        key, value = key_value.split(':', 1)
        if not output or key in output[0]:
            output.append({})
        output[-1][key] = value

上面代码的问题是它没有维护列表的列表并将OID字段与其他数据项混淆,我想要一个从每个OID开始的字典。

任何帮助将不胜感激:)

问题是每次 output 的第一个元素有 key 时,你都会向 output 追加一个新的字典正在寻找。这会导致您的代码失败,因为在处理完第一个 list in splitted 之后,output 的第一个元素如下所示:

{'OID': 'XXXXXXXXXXX1',
  ' street': 'THE ROAD',
  'town': 'NEVERPOOL',
  'postcode': 'M1 2DD',
  'Name': 'SOMEHWERE',
  'street': 'THE ROAD'}

您以后将看到的所有 key 值都已存在于所述元素中。

你真正想要做的是在每次遇到新的list in splitted.

添加一个新的字典
output = []
for l in splitted:
    output.append(dict())
    for key_value in l:
        key, value = key_value.split(':', 1)
        output[-1][key] = value

现在你得到了你所期望的:

[{'OID': 'XXXXXXXXXXX1',
  ' street': 'THE ROAD',
  'town': 'NEVERLAND',
  'postcode': 'M1 2DD',
  'Name': 'SOMEHWERE',
  'street': 'THE ROAD'},
 {'OID': 'XXXXXXXXXXX2',
  ' Name': '30',
  'street': 'DA PLACE',
  'town': 'PERTH',
  'postcode': 'PH1 2DD',
  'Name': '30'}]

当我引起你的注意时:

  • dicts 是 python 中的无序数据类型(或按插入顺序排序),因此“将 OID 字段与其他数据项混合”并不是真的。你想用所有这些键创建一个单个字典,但你最终创建了一堆字典,每个字典都有一个键(在第一个之后)
  • list 是 python 中的内置 class,因此创建一个名为 list 的变量会隐藏此 class。你不应该这样做,因为以后如果你想使用 list class.
  • 可能会遇到错误
  • 调试是程序员必须具备的一项重要技能。我鼓励您查看这些链接:How to debug small programs. | What is a debugger and how can it help me diagnose problems? 您可以使用调试器单步执行代码并观察每条语句如何影响程序的状态,这有助于您找出问题所在。

您也可以尝试使用字典理解:

[{x.split(":")[0]:x.split(":")[1] for x in splitted[0]},
 {x.split(":")[0]:x.split(":")[1] for x in splitted[1]}] 

输出为:

[{'OID': 'XXXXXXXXXXX1', ' street': 'THE ROAD', 'town': 'NEVERLAND', 'postcode': 'M1 2DD', 'Name': 'SOMEHWERE', 'street': 'THE ROAD'}, {'OID': 'XXXXXXXXXXX2', ' Name': '30', 'street': 'DA PLACE', 'town': 'PERTH', 'postcode': 'PH1 2DD', 'Name': '30'}]