CSV transformation all combinations of row columns

Viewed 180

I have a csv file of names and variations of these names. The file looks something like this:

Abigail | Abby | Abbey | Abbie
Abraham | Abe  |       |
Aidan   | Aodh | Aiden |

etc.

I was wondering if there was a python script I could use that would pair these up for me as such:

Abigail Abby
Abigail Abbey,
Abigail Abbie,
Abby Abbey,
Abby Abbie,
Abbey Abbie,
Abraham Abe,
Aidan Aodh,
Aidan Aiden,
Aodh Aiden

ie getting every possible combination for each row. Has anyone any starting advice for this?

2 Answers

First you have to turn your csv file into a list of list:

import csv

with open('csv.csv') as file:
    names = [list(filter(None, row)) for row in csv.reader(file)]

What you get :

names = [["Abigail","Abby","Abbey","Abbie"],["Abraham","Abe"],["Aidan","Aodh","Aiden"]]

Then you can do it quite simply like this :

combinations = []

for row in names:
    for i,n1 in enumerate(row):
        for n2 in row[i+1:]:
            combinations.append((n1,n2))

result:

[('Abigail', 'Abby'), ('Abigail', 'Abbey'), ('Abigail', 'Abbie'), ('Abby', 'Abbey'), ('Abby', 'Abbie'), ('Abbey', 'Abbie'), ('Abraham', 'Abe'), ('Aidan', 'Aodh'), ('Aidan', 'Aiden'), ('Aodh', 'Aiden')]

You can use a list comprehension:

import csv
def row_combo(d):
   return [[a, k] for i, a in enumerate(d) for k in d[:i]+d[i+1:]]

r = [k for i in csv.reader(open('file.csv'), delimiter='|') for k in row_combo(i)]
final_r = [[a, b] for j, k in r if (a:=j.strip()) and (b:=k.strip())] #clean data

Output:

[['Abigail', 'Abby'], ['Abigail', 'Abbey'], ['Abigail', 'Abbie'], ['Abby', 'Abigail'], ['Abby', 'Abbey'], ['Abby', 'Abbie'], ['Abbey', 'Abigail'], ['Abbey', 'Abby'], ['Abbey', 'Abbie'], ['Abbie', 'Abigail'], ['Abbie', 'Abby'], ['Abbie', 'Abbey'], ['Abraham', 'Abe'], ['Abe', 'Abraham'], ['Aidan', 'Aodh'], ['Aidan', 'Aiden'], ['Aodh', 'Aidan'], ['Aodh', 'Aiden'], ['Aiden', 'Aidan'], ['Aiden', 'Aodh']]
Related