python-3.x 当值不存在时转换嵌套列表为嵌套字典创建新字典

b5buobof  于 2023-01-10  发布在  Python
关注(0)|答案(2)|浏览(130)

输入资料

data = [
    ['QR', ''],
    ['Cust', ''],
    ['fea', 'restroom'],
    ['chain', 'pa'],
    ['store', 'cd'],
    ['App', ''],
    ['End', 'EndnR'],
    ['Request', '0'],
    ['Sound', '15'],
    ['Target', '60'],
    ['Is', 'TRUE']
]

只要值中有空格,我们就应该创建新词典。

    • o/p喜欢**

x一个一个一个一个x一个一个二个x

laawzig2

laawzig21#

考虑使用itertools.groupby函数的以下方法:

from itertools import groupby

data=[['QR', ''], ['Cust', ''], ['fea', 'restroom'], ['chain', 'pa'], ['store', 'cd'], ['App', ''], ['End', 'EndnR'],
      ['Request', '0'], ['Sound', '15'], ['Target', '60'], ['Is', 'TRUE']]

def l_to_dict(data):
    store = []
    for new_d, gr in groupby(data, lambda x: x[1] == ''):
        if not store:
            store.append({})
        if new_d:   # having new nested dict case
            for k, v in gr:
                store[-1][k] = {}
                store.append(store[-1][k])  # append last empty dict to the back
        else:
            curr = store[-1] if len(store) == 1 else store.pop()
            for k, v in gr:
                curr[k] = v
    return store[0]

pprint(l_to_dict(data), width=10, sort_dicts=False)
{'QR': {'Cust': {'fea': 'restroom',
                 'chain': 'pa',
                 'store': 'cd'},
        'App': {'End': 'EndnR',
                'Request': '0',
                'Sound': '15',
                'Target': '60',
                'Is': 'TRUE'}}}
xdnvmnnf

xdnvmnnf2#

试试这个:

result = {}
nbr_keys = 0
keys = [ item[0] for item in data if item[1] == "" ]

for index, item in enumerate(data):
    
    if index == 0:
        if item[1] == "":
            key = item[0]
            di[item[0]] = {}
    else:
        
        if item[1] == "":
            di[key].update({item[0]: {}})
            nbr_keys +=1
            
        else:
            di[key][keys[nbr_keys]].update({item[0]: item[1]})

其输出如下:

{'QR': {'Cust': {'fea': 'restroom', 'chain': 'pa', 'store': 'cd'},
  'App': {'End': 'EndnR',
   'Request': '0',
   'Sound': '15',
   'Target': '60',
   'Is': 'TRUE'}}}

相关问题