簡體   English   中英

將字典列表轉換為具有相同鍵名的單個字典

[英]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'}}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM