如何将列表的列表转换为dict键值对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 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'}]

当我有你的注意:

  • dict是python中的无序数据类型(或按插入顺序排序),因此"将OID字段与其他数据项混合"。并不是一个真正的东西。您想创建一个包含所有这些键的单个字典,但是您最终创建了一堆字典,每个字典都有一个键(在第一个键之后)
  • list是python中的内置类,因此创建一个名为list的变量会遮蔽这个类。您不应该这样做,因为以后如果您想使用list类,可能会遇到错误。
  • 调试对程序员来说是一项至关重要的技能。我鼓励您看看这些链接:如何调试小程序。|什么是调试器?它如何帮助我诊断问题?您可以使用调试器来逐步检查代码,并观察每个语句如何影响程序的状态,这可以帮助您找出出错的地方。

我相信这样更简单:

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']]
output = []
for i in range(len(splitted)):
output.append(dict())
for j in splitted[i]:
k,v = j.split(':')
output[i][k] = v

输出为:

[{'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'}]

您也可以尝试使用字典推导:

[{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'}]

最新更新