goldenasian
goldenasian

Reputation: 274

Converting list in list to dictionary

I got a list like this:

[['a','b','1','2']['c','d','3','4']]

and I want to convert this list to dictionary something looks like this:

{
    ('a','b'):('1','2'),
    ('c','d'):('3','4')
}

for example, ('a', 'b') & ('c','d') for key and ('1','2') &('3','4') for value

so I used code something like this

new_dict = {}
for i, k in enumerate(li[0:2]):
    new_dict[k] =[x1[i] for x1 in li[2:]]
print(new_dict)

,but it caused unhashable type error 'list'

I tried several other way, but it didn't work well.. Is there any way that I can fix it?

Upvotes: 1

Views: 97

Answers (4)

Daweo
Daweo

Reputation: 36370

I would use list-comprehension following way:

lst = [['a','b','1','2']['c','d','3','4']]
dct = dict([(tuple(i[:2]),tuple(i[2:])) for i in lst])
print(dct)

or alternatively dict-comprehension:

dct = {tuple(i[:2]):tuple(i[2:]) for i in lst}

Output:

{('a', 'b'): ('1', '2'), ('c', 'd'): ('3', '4')}

Note that list slicing produce lists, which are mutable and can not be used as dict keys, so I use tuple to convert these to immutable tuples.

Upvotes: 1

azro
azro

Reputation: 54148

You can't have list as key, but tuple is possible. Also you don't need to slice on your list, but on the sublist.

You need the 2 first values sublist[:2] as key and the corresponding values is the sublist from index 2 sublist[2:]

new_dict = {}
for sublist in li:
    new_dict[tuple(sublist[:2])] = tuple(sublist[2:])

print(new_dict)  # {('a', 'b'): ('1', '2'), ('c', 'd'): ('3', '4')}

The same with dict comprehension

new_dict = {tuple(sublist[:2]): tuple(sublist[2:]) for sublist in li}
print(new_dict)  # {('a', 'b'): ('1', '2'), ('c', 'd'): ('3', '4')}

Upvotes: 5

Moha Dehghan
Moha Dehghan

Reputation: 18443

li = [['a','b','1','2'],['c','d','3','4']]
new_dict = {}
for item in li:
    new_dict[(item[0], item[1])] = (item[2], item[3])

Upvotes: 1

Rieljun Liguid
Rieljun Liguid

Reputation: 1531

You can do it with dict comprehension:

li = [
    ['a', 'b', '1', '2'],
    ['c', 'd', '3', '4'],
]

new_dict = {(i[0], i[1]): (i[2], i[3]) for i in li}

print(new_dict)


# result
{('a', 'b'): ('1', '2'), ('c', 'd'): ('3', '4')}

Upvotes: 0

Related Questions