user14177720
user14177720

Reputation:

How to convert 3 item tuple to dictionary

I need to convert tuples with nested tuples to a dictionary with dictionaries

b = ('abcm1', (
     ('mxcludm', '123'), 
     ('an1', 'abcaa'), 
     ('an2', 'dmf'), 
     ('an3', 'mf'), 
     ('an4', 'dfd'), 
     ('an5', 'asdfs'), 
     ('ou', 'tmst'), 
     ('output', 'ou'), 
     ('archi', (
         ('an1***an2', ''), 
         ('an2***an3', ''), 
         ('an3***an4', ''), 
         ('an4***an5', '')
      )
      ), 
      ('customer', '1'))
   )

My Expected out

{'abcm1': {
    'mxcludm':'123',
    'an1': 'abcaa', 
    'an2': 'dmf', 
    'an3': 'mf', 
    'an4': 'dfd', 
    'an5': 'asdfs', 
    'ou': 'tmst', 
    'output': 'ou', 
    'archi':{ 
            'an1***an2': '', 
            'an2***an3': '', 
            'an3***an4': '', 
            'an4***an5': ''
    },
    'customer': '1'
    }
}

For 2 tuple we can pass directly

def Convert(tup, di): 
    di = dict(tup) 
    return di 
di = {} 
tup =  ('a2', 'aa'), ('i', 'aa'), ('w4', 'aa'), ('i5', 'aa')
print (Convert(tup, di))

while i am proceeding i got error too many values to unpact

Upvotes: 0

Views: 232

Answers (1)

DarrylG
DarrylG

Reputation: 17156

There is an error in your desired output

'customer': 'dmfault' should be 'customer': '1'

Here's a recursive function that handles arbitrary levels of nesting.

Code

def convert(item): 
    if isinstance(item, str):
        return item
    
    # Key as string
    # Just need to convert value
    if isinstance(item[0], str):
        return {item[0]:convert(item[1])}  # convert value

    # Convert key & value as elements in dictionary di
    di = {}
    for x in item:
        di.update(convert(x))
    return di

Test

b = ('abcm1', (('mxcludm', '123'), ('an1', 'abcaa'), ('an2', 'dmf'), ('an3', 'mf'), ('an4', 'dfd'), ('an5', 'asdfs'), ('ou', 'tmst'), ('output', 'ou'), ('archi', (('an1***an2', ''), ('an2***an3', ''), ('an3***an4', ''), ('an4***an5', ''))), ('customer', '1')))

di = convert(b)
print(di)

Output

{'abcm1': {'mxcludm': '123', 'an1': 'abcaa', 'an2': 'dmf', 'an3': 'mf', 'an4': 'dfd', 'an5': 'asdfs', 'ou': 'tmst', 'output': 'ou', 'archi': {'an1***an2': '', 'an2***an3': '', 'an3***an4': '', 'an4***an5': ''}, 'customer': '1'}}

Upvotes: 1

Related Questions