how to combine a list when writing into a txt file?

Viewed 54

I have three lists which I need to write it in a txt file. I need to combine the 'name' that is different but have the same 'file' and 'role'

new_d=[{'file': '1_2', 'name': 'paul', 'role': 'engineer'},
       {'file': '2_3', 'name': 'josh', 'role': 'doctor'},
       {'file': '1_2', 'name': 'smith', 'role': 'engineer'},
       {'file': '1_2', 'name': 'mei', 'role': 'engineer'},
       {'file': '2_3', 'name': 'kelly', 'role': 'doctor'},....]

file=[value.split("_")[0] for line in new_d for key,value in line.items() if key == "file"]
name=[value for line in new_d for key,value in line.items() if key == "name"]
role=[value for line in new_d for key,value in line.items() if key == "role"]

This is how I wrote my script to output it

for f,n,r in zip(file,name,role):
        f.write('file={f} \t name={n} \t role={r}\n'.format(f=f,n=n,r=r))

I need my output to be print like this

file=1 name=paul-smith-mei role=engineer
file=2 name=josh-kelly role=doctor

But my output is

file=1 name=paul- role=engineer
file=1 name=smith- role=engineer
file=1 name=mei- role=engineer
4 Answers

Using a simple iteration and dict.setdefault

Ex:

new_d=[{'file': '1_2', 'name': 'paul', 'role': 'engineer'},
       {'file': '2_3', 'name': 'josh', 'role': 'doctor'},
       {'file': '1_2', 'name': 'smith', 'role': 'engineer'},
       {'file': '1_2', 'name': 'mei', 'role': 'engineer'},
       {'file': '2_3', 'name': 'kelly', 'role': 'doctor'}]

result = {}
for item in new_d:
    f = item['file'].split("_")[0]
    result.setdefault((item['role'], f), []).append(item['name'])

    
for (role, f), v in result.items(): 
    print(f'file={f} \t name={"-".join(v)} \t role={role}')

To write to file

with open(filename, "w") as outfile:
    for (role, f), v in result.items(): 
        outfile.write(f'file={f} \t name={"-".join(v)} \t role={role}\n')

Output:

file=1   name=paul-smith-mei     role=engineer
file=2   name=josh-kelly     role=doctor

Using Pandas

new_d=[{'file': '1_2', 'name': 'paul', 'role': 'engineer'},
       {'file': '2_3', 'name': 'josh', 'role': 'doctor'},
       {'file': '1_2', 'name': 'smith', 'role': 'engineer'},
       {'file': '1_2', 'name': 'mei', 'role': 'engineer'},
       {'file': '2_3', 'name': 'kelly', 'role': 'doctor'}]

df = pd.DataFrame(new_d)

for group_name, group in df.groupby(['file', 'role']):
  name = "-".join(group['name'].values)
  file = group_name[0].split("_")[0]
  print (f"file={file} name={name} role={group_name[1]}")

You can use groupby from itertools. Itertools is a standard library in python.

from itertools import groupby

for k,v in groupby(sorted(new_d, key=lambda x:x['file']), key=lambda x:x['file'].split('_')[0]+x['role']):
    z=list(v)
    print("file={} name={} role={}".format(z[0]['file'].split('_')[0], '-'.join([x['name'] for x in z]), z[0]['role']))

Create a seperate dictionary and initialize it empty Then iterate over each index in the array and check if file is same then concatenate name key

Related