Pradya Panyainkaew
Pradya Panyainkaew

Reputation: 79

How to create dictionary from different length of list in python

I have a list of x like this:

x =[[[1, 2]], [[2, 1], [2, 3]], [[3, 2]], [[4, 7, 6, 5]]]

And I try to create a list of dictionary in final result like this:

dict_list = [{"user_idx": 1, "partner_1": 2}, {"user_idx": 2, "partner_1": 1, "partner_2": 3}, 
            {"user_idx": 3, "partner_1": 2}, {"user_idx": 4, "partner_1":7, "partner_2": 6,"partner_3":5}]

How can I complete it with python code?

Upvotes: 2

Views: 533

Answers (2)

mcsoini
mcsoini

Reputation: 6642

This clearly needs a single list comprehension solution, though admittedly this is getting a bit out of hands:

dict_list = [
    {"user_idx": (s := list(chain.from_iterable(z if i == 0 else z[1:] 
                                   for i, z in enumerate(el))))[0],
     **{f"partner_{ii + 1}": p for ii, p in enumerate(s[1:])}}
     for el in x]
print(dict_list)

# Out:
[{'user_idx': 1, 'partner_1': 2}, 
 {'user_idx': 2, 'partner_1': 1, 'partner_2': 3}, 
 {'user_idx': 3, 'partner_1': 2}, 
 {'user_idx': 4, 'partner_1': 7, 'partner_2': 6, 'partner_3': 5}]

Upvotes: 1

Andrej Kesely
Andrej Kesely

Reputation: 195543

Try:

x =[[[1, 2]], [[2, 1], [2, 3]], [[3, 2]], [[4, 7, 6, 5]]]

out = {}
for g in x:
    for subl in g:
        out.setdefault(subl[0], []).extend(subl[1:])

out = [
    {
        "user_idx": k,
        **{"partner_{}".format(idx): i for idx, i in enumerate(v, 1)},
    }
    for k, v in out.items()
]
print(out)

Prints:

[
    {"user_idx": 1, "partner_1": 2},
    {"user_idx": 2, "partner_1": 1, "partner_2": 3},
    {"user_idx": 3, "partner_1": 2},
    {"user_idx": 4, "partner_1": 7, "partner_2": 6, "partner_3": 5},
]

Upvotes: 2

Related Questions