Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Convert lines of string to a dictionary

I have an initial code like this:

record = "Jane,Doe,25/02/2002;
          James,Poe,19/03/1998;
          Max,Soe,16/12/2001
          ..."

I need to make it into a dictionary and its output should be something like this:

{'First name': 'Jane', 'Last name': 'Doe', 'Birthday': '25/02/2002'}
{'First name': 'James', 'Last name': 'Poe', 'Birthday': '19/03/1998'}
...

Each line should have an incrementing key starting from 1.

I currently have no idea to approach this issue as I am still a student with no prior experience.

I have seen people use this for strings containing key-value pairs but my string does not contain those:

mydict = dict((k.strip(), v.strip()) for k,v in 
              (item.split('-') for item in record.split(',')))
like image 769
josh Avatar asked Apr 27 '21 13:04

josh


2 Answers

Use 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'}]
like image 140
Mayank Porwal Avatar answered Nov 13 '22 21:11

Mayank Porwal


To make the required dictionary for a single line, you can use split to chop up the line where there are commas (','), to get the values for the dictionary, and hard-code the keys. E.g.

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

Now to repeat that for each line in the record, a list of all the lines is needed. Again, you can use split in this case to chop up the input where there are semicolons (';'). E.g.

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

Now you can iterate the solution for one line over this lines list, collecting the results into another list.

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

The incremental key requirement you mention seems strange, because you could just keep them in a list, where the index in the list is effectively the key. But of course, if you really need the indexed-dictionary thing, you can use a dictionary comprehension to do that.

results = {i + 1: results[i] for i in range(len(results))}

Finally, the whole thing might be made more concise (and nicer IMO) by using a combination of list and dictionary comprehensions, as well as a list of your expected keys.

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(";")]

With the optional indexed-dictionary thingy:

results = {i + 1: results[i] for i in range(len(results))}
like image 45
L.Grozinger Avatar answered Nov 13 '22 20:11

L.Grozinger