learner
learner

Reputation: 877

Python: Convert 2d list to dictionary with indexes as values

I have a 2d list with arbitrary strings like this:

    lst = [['a', 'xyz' , 'tps'], ['rtr' , 'xyz']]

I want to create a dictionary out of this:

    {'a': 0, 'xyz': 1, 'tps': 2, 'rtr': 3}

How do I do this? This answer answers for 1D list for non-repeated values, but, I have a 2d list and values can repeat. Is there a generic way of doing this?

Upvotes: 1

Views: 250

Answers (3)

Sash Sinha
Sash Sinha

Reputation: 22472

Maybe you could use two for-loops:

lst = [['a', 'xyz' , 'tps'], ['rtr' , 'xyz']]
d = {}
overall_idx = 0
for sub_lst in lst:
    for word in sub_lst:
        if word not in d:
            d[word] = overall_idx
            # Increment overall_idx below if you want to only increment if word is not previously seen
            # overall_idx += 1
        overall_idx += 1
print(d)

Output:

{'a': 0, 'xyz': 1, 'tps': 2, 'rtr': 3}

Upvotes: 1

Jayvee
Jayvee

Reputation: 10873

also, with collections and itertools:

import itertools
from collections import OrderedDict

lstdict={}
lst = [['a', 'xyz' , 'tps'], ['rtr' , 'xyz']]
lstkeys = list(OrderedDict(zip(itertools.chain(*lst), itertools.repeat(None))))
lstdict = {lstkeys[i]: i for i in range(0, len(lstkeys))}
lstdict

output:

{'a': 0, 'xyz': 1, 'tps': 2, 'rtr': 3}

Upvotes: 1

norie
norie

Reputation: 9867

You could first convert the list of lists to a list using a 'double' list comprehension.

Next, get rid of all the duplicates using a dictionary comprehension, we could use set for that but would lose the order.

Finally use another dictionary comprehension to get the desired result.

lst = [['a', 'xyz' , 'tps'], ['rtr' , 'xyz']]

# flatten list of lists to a list
flat_list = [item for sublist in lst for item in sublist]

# remove duplicates
ordered_set = {x:0 for x in flat_list}.keys()

# create required output
the_dictionary = {v:i for i, v in enumerate(ordered_set)}

print(the_dictionary)

""" OUTPUT
{'a': 0, 'xyz': 1, 'tps': 2, 'rtr': 3}
"""

Upvotes: 1

Related Questions