将字符串行转换为字典

jos*_*osh 6 python dictionary

我有一个这样的初始代码:

record = "Jane,Doe,25/02/2002;
          James,Poe,19/03/1998;
          Max,Soe,16/12/2001
          ..."
Run Code Online (Sandbox Code Playgroud)

我需要把它变成一个字典,它的输出应该是这样的:

{'First name': 'Jane', 'Last name': 'Doe', 'Birthday': '25/02/2002'}
{'First name': 'James', 'Last name': 'Poe', 'Birthday': '19/03/1998'}
...
Run Code Online (Sandbox Code Playgroud)

每行应该有一个从 1 开始的递增键。

我目前不知道解决这个问题,因为我仍然是一个没有经验的学生。

我见过人们将它用于包含键值对的字符串,但我的字符串不包含这些:

mydict = dict((k.strip(), v.strip()) for k,v in 
              (item.split('-') for item in record.split(',')))
Run Code Online (Sandbox Code Playgroud)

May*_*wal 6

使用split

In [220]: ans = []

In [221]: record = "Jane,Doe,25/02/2002;James,Poe,19/03/1998;Max,Soe,16/12/2001"
In [223]: l = record.split(';')

In [227]: for i in l:
     ...:     l1 = i.split(',')
     ...:     d = {'First Name': l1[0], 'Last Name': l1[1], 'Birthday': l1[2]}
     ...:     ans.append(d)
     ...: 

In [228]: ans
Out[228]: 
[{'First Name': 'Jane', 'Last Name': 'Doe', 'Birthday': '25/02/2002'},
 {'First Name': 'James', 'Last Name': 'Poe', 'Birthday': '19/03/1998'},
 {'First Name': 'Max', 'Last Name': 'Soe', 'Birthday': '16/12/2001'}]
Run Code Online (Sandbox Code Playgroud)


L.G*_*ger 4

要为单行创建所需的字典,可以使用split截断有逗号(',')的行,获取字典的值,并对键进行硬编码。例如

line   = "Jane,Doe,25/02/2002"
values = line.split(",")
d = {"First Name": values[0], "Last Name": values[1], "Birthday": values[2]}
Run Code Online (Sandbox Code Playgroud)

现在要对记录中的每一行重复此操作,需要所有行的列表。同样,split在这种情况下,您可以使用它来截断包含分号(';')的输入。例如

record = "Jane,Doe,25/02/2002;James,Poe,19/03/1998;Max,Soe,16/12/2001"
lines = record.split(";")
Run Code Online (Sandbox Code Playgroud)

现在,您可以在此列表上迭代一行的解决方案lines,将结果收集到另一个列表中。

results = []
for line in lines:
  values = line.split(",")
  results.append({"First Name": values[0], "Last Name": values[1], "Birthday": values[2]})
Run Code Online (Sandbox Code Playgroud)

您提到的增量键要求似乎很奇怪,因为您可以将它们保存在列表中,其中列表中的索引实际上是键。但是当然,如​​果您确实需要索引字典,则可以使用字典理解来做到这一点。

results = {i + 1: results[i] for i in range(len(results))}
Run Code Online (Sandbox Code Playgroud)

最后,通过使用列表和字典理解的组合以及预期键的列表,整个事情可能会变得更加简洁(并且在我看来更好)。

record  = "Jane,Doe,25/02/2002;James,Poe,19/03/1998;Max,Soe,16/12/2001"
keys    = ["First Name", "Last Name", "Birthday"]
results = [dict(zip(keys, line.split(","))) for line in record.split(";")]
Run Code Online (Sandbox Code Playgroud)

使用可选的索引字典:

results = {i + 1: results[i] for i in range(len(results))}
Run Code Online (Sandbox Code Playgroud)