将字典列表转换为具有相同键名的单个字典

convert a list of dictionaries to a single dictionary which has same key names

我有一个具有相同键的字典列表。当我尝试转换时,我只得到一本字典作为输出。

下面是我试过的代码

d = [{'tk': {'inputCol': 'text', 'outputCol': 'texttk'},
  'sw': {'inputCol': 'texttk', 'outputCol': 'textsw'},
  'hf': {'inputCol': 'textsw','outputCol': 'texthtf','numFeatures': 1024},
  'IDF': {'inputCol': 'texthtf', 'outputCol': 'textidf'}},
 {'tk': {'inputCol': 'domains', 'outputCol': 'domainstk'},
  'sw': {'inputCol': 'domainstk', 'outputCol': 'domainssw'},
  'hf': {'inputCol': 'domainssw','outputCol': 'domainshtf','numFeatures': 1024},
  'IDF': {'inputCol': 'domainshtf', 'outputCol': 'domainsidf'}},
 {'va': {'inputCol': ['textidf', 'domainsidf'],'outputCol': 'assembler_features'},
  'ms': {'inputCol': 'assembler_features','outputCol': 'scaled_features'}}]

out = {k:v for x in d for k,v in x.items()}
print(out)

{'tk': {'inputCol': 'domains', 'outputCol': 'domainstk'},
 'sw': {'inputCol': 'domainstk', 'outputCol': 'domainssw'},
 'hf': {'inputCol': 'domainssw',
  'outputCol': 'domainshtf',
  'numFeatures': 1024},
 'IDF': {'inputCol': 'domainshtf', 'outputCol': 'domainsidf'},
 'va': {'inputCol': ['textidf', 'domainsidf'],
  'outputCol': 'assembler_features'},
 'ms': {'inputCol': 'assembler_features', 'outputCol': 'scaled_features'}}

我需要以下格式的输出

 {'tk': {'inputCol': 'text', 'outputCol': 'texttk'},
  'sw': {'inputCol': 'texttk', 'outputCol': 'textsw'},
  'hf': {'inputCol': 'textsw','outputCol': 'texthtf','numFeatures': 1024},
  'IDF': {'inputCol': 'texthtf', 'outputCol': 'textidf'},
  'tk': {'inputCol': 'domains', 'outputCol': 'domainstk'},
  'sw': {'inputCol': 'domainstk', 'outputCol': 'domainssw'},
  'hf': {'inputCol': 'domainssw','outputCol': 'domainshtf','numFeatures': 1024},
  'IDF': {'inputCol': 'domainshtf', 'outputCol': 'domainsidf'},
  'va': {'inputCol': ['textidf', 'domainsidf'],'outputCol': 'assembler_features'},
  'ms': {'inputCol': 'assembler_features','outputCol': 'scaled_features'}}

不可能在同一个词典中使用相同的键。您可以采取的一种方法是将重复键的值放在一个列表中,该列表就是该键的值。

例如,取而代之的是(我重复一遍,这是不可能的):

{
    'tk': {'inputCol': 'text', 'outputCol': 'texttk'},
    'tk': {'inputCol': 'domains', 'outputCol': 'domainstk'}
}

你可以有这样的东西:

{
    'tk': [
        {'inputCol': 'text', 'outputCol': 'texttk'},
        {'inputCol': 'domains', 'outputCol': 'domainstk'}
    ]
}

如何做到?

out = {}
for x in d:
    for k, v in x.items():
        out_val = out.get(k, [])
        out_val.append(v)
        out[k] = out_val

注意:这将以字典结尾,其中所有值都是列表(长度 > 1 的值表示重复的键)。

如果您想要一个干净的输出,其中只有重复的键具有列表值,您可以将其附加到代码中:

out = {k:v[0] if len(v) == 1 else v for k, v in out.items()}

输出:

{'IDF': [{'inputCol': 'texthtf', 'outputCol': 'textidf'},
         {'inputCol': 'domainshtf', 'outputCol': 'domainsidf'}],
 'hf': [{'inputCol': 'textsw', 'numFeatures': 1024, 'outputCol': 'texthtf'},
        {'inputCol': 'domainssw',
         'numFeatures': 1024,
         'outputCol': 'domainshtf'}],
 'ms': {'inputCol': 'assembler_features', 'outputCol': 'scaled_features'},
 'sw': [{'inputCol': 'texttk', 'outputCol': 'textsw'},
        {'inputCol': 'domainstk', 'outputCol': 'domainssw'}],
 'tk': [{'inputCol': 'text', 'outputCol': 'texttk'},
        {'inputCol': 'domains', 'outputCol': 'domainstk'}],
 'va': {'inputCol': ['textidf', 'domainsidf'],
        'outputCol': 'assembler_features'}}