1

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?

learner
  • 857
  • 1
  • 14
  • 28

3 Answers3

1

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}
Sash Sinha
  • 18,743
  • 3
  • 23
  • 40
1

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}
"""
norie
  • 9,609
  • 2
  • 11
  • 18
1

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}
Jayvee
  • 10,670
  • 3
  • 29
  • 40