I have one list named columns, and I have to create one nested list based on a split of the elements (the first three).
For example, I will divide this element ‘101 Drive 1 A’ in ‘101 Drive 1’ and make a group.
JavaScript
x
2
1
columns = ['101 Drive 1 A','101 Drive 1 B','102 Drive 2 A','102 Drive 2 B','102 Drive 2 C','103 Drive 1 A']
2
The output will look like this:
JavaScript
1
6
1
[
2
['101 Drive 1 A', '101 Drive 1 B'],
3
['102 Drive 2 A', '102 Drive 2 B', '102 Drive 2 C'],
4
['103 Drive 1 A']
5
]
6
Advertisement
Answer
One approach using collections.defaultdict
:
JavaScript
1
12
12
1
from collections import defaultdict
2
3
columns = ['101 Drive 1 A', '101 Drive 1 B', '102 Drive 2 A', '102 Drive 2 B', '102 Drive 2 C', '103 Drive 1 A']
4
5
groups = defaultdict(list)
6
for column in columns:
7
key = column[:3]
8
groups[key].append(column)
9
10
res = list(groups.values())
11
print(res)
12
Output
JavaScript
1
2
1
[['101 Drive 1 A', '101 Drive 1 B'], ['102 Drive 2 A', '102 Drive 2 B', '102 Drive 2 C'], ['103 Drive 1 A']]
2
A more robust alternative, that is going to work for any number at the beginning of the string, is to use a regular expression:
JavaScript
1
10
10
1
import re
2
3
groups = defaultdict(list)
4
for column in columns:
5
key = re.match("d+", column).group()
6
groups[key].append(column)
7
8
res = list(groups.values())
9
print(res)
10