Question: I have two lists like this,

```
a=[['a', 'b', 'c'], ['b', 'c'], ['a', 'd'], ['x']]
b=[[1, 2, 3], [4,5], [6,7], [8]] (the size of a and b is always same)

```

Now I want to create two list with the sum of unique elements, so the final lists should look like,

```
 a=['a', 'b', 'c', 'd', 'x']
 b=[7, 6, 8, 7, 8] (sum of all a, b, d, d and x)

```

I could do this using for loop but looking for some efficient way to reduce execution time.

Answer: 
Not so pythonic but will do the job:

```
a=[['a', 'b', 'c'], ['b', 'c'], ['a', 'd'], ['x']]
b=[[1, 2, 3], [4,5], [6,7], [8]]

mapn = dict()
for elt1, elt2 in zip(a, b):
    for e1, e2 in zip(elt1, elt2):
        mapn[e1] = mapn.get(e1, 0) + e2

elts = mapn.keys()
counts = mapn.values()

print(mapn)
print(elts)
print(counts)

```
At the end of the day, you're going to have to use two for loops. I have a one liner solution using `zip` and `Counter`.

The first solutions works only in this specific case where all the strings are a single character, because it creates a string with the right number of each letter, and then gets the frequency of each letter.

```
from collections import Counter

a = [['a', 'b', 'c'], ['b', 'c'], ['a', 'd'], ['x']]
b = [[1, 2, 3], [4,5], [6,7], [8]]

a, b = zip(*Counter(''.join(x*y for al, bl in zip(a, b) for x, y in zip(al, bl))).items())

```

For the more general case, you can do:

```
a, b = zip(*Counter(dict(p for al, bl in zip(a, b) for p in zip(al, bl))).items())

```