从Python中的字典列表创建新字典

时间:2016-02-03 11:57:02

标签: python dictionary

我有一个字典列表,其中一些值是字符串,其他值是整数:

list_countries = [{'country' : 'Suriname', 
            'population' : 532724,
            'capital': 'Paramaribo', 
            'anthem': 'God zij met ons Suriname'},
            {'country' : 'Sweden', 
            'population' : 9683248,
            'capital': 'Stockholm', 
            'anthem': 'Du gamla, Du fria'},
             ...]

我想将每个键值对重塑为一个新的大词典。但是,我的方法存在问题:

dict_countries = { 'countries':       [],
                   'pop':             [],
                   'capital_city':    [],
                   'national_anthem': [] }

然后我迭代并用.extend()附加所有值。

for dictionary in list_countries:
    dict_countries['countries'].extend(dictionary['country'])
    dict_countries['pop'].extend(dictionary['population'])
    dict_countries['capital_city'].extend(dictionary['capital'])
    dict_countries['national_anthem'].extend(dictionary['anthem'])

然而,这不起作用。所有字符串都是逐字逐句打破的。对于整数,我得到错误:

TypeError: 'int' object is not iterable

这样做的正确方法是什么?

编辑:我相信每个键都有一个值。但是,让我们说没有。如果没有找到值,我将如何重写上述内容以添加NaN

5 个答案:

答案 0 :(得分:3)

// For each screen, add the screen properties to a list box. foreach (var screen in System.Windows.Forms.Screen.AllScreens) { listBox1.Items.Add("Device Name: " + screen.DeviceName); listBox1.Items.Add("Bounds: " + screen.Bounds.ToString()); listBox1.Items.Add("Type: " + screen.GetType().ToString()); listBox1.Items.Add("Working Area: " + screen.WorkingArea.ToString()); listBox1.Items.Add("Primary Screen: " + screen.Primary.ToString()); } 期望传递给它的参数是可迭代的,即。列表或字符串等。根据您的示例,.extend()是一个整数,因此不能迭代,因此您的异常消息。

如果您将其更改为population,它的行为将与您预期的一样。

答案 1 :(得分:1)

您获得输出的原因是因为列表中的appendextend之间存在差异。如果extend使用iterable作为参数(字符串是),它会将iterable中的每个项内联到dict中(这是字符串的每个字母)。然而它因int而失败,因为它不是可迭代的。我更愿意使用append,它只是附加到dict中的列表中。

list_countries = [{'country' : 'Suriname', 
            'population' : 532724,
            'capital': 'Paramaribo', 
            'anthem': 'God zij met ons Suriname'},
            {'country' : 'Sweden', 
            'population' : 9683248,
            'capital': 'Stockholm', 
            'anthem': 'Du gamla, Du fria'}]

dict_countries = { 'countries':       [],
                   'pop':             [],
                   'capital_city':    [],
                   'national_anthem': [] }

for dictionary in list_countries:
    dict_countries['countries'].append(dictionary['country'])
    dict_countries['pop'].append(dictionary['population'])
    dict_countries['capital_city'].append(dictionary['capital'])
    dict_countries['national_anthem'].append(dictionary['anthem'])

print dict_countries

答案 2 :(得分:1)

这里有两个问题要解决:
构建词典中的值列表,并将旧键转换为新名称。

使用内置词典的setdefault方法和 使用翻译词典作为字面意义上的字典(即用于翻译)。

设置如下翻译:

>>> translations = {'country': 'countries',
...                 'population': 'pop',
...                 'capital': 'capital_city',
...                 'anthem': 'national_anthem'}

然后建立你的新词典:

>>> merged = {}
>>> for d in list_countries:
...     for k in d:
...         key = translations.get(k, k)
...         merged.setdefault(key, []).append(d[k])
... 
>>> merged
{'national_anthem': ['God zij met ons Suriname', 'Du gamla, Du fria'], 'capital_city': ['Paramaribo', 'Stockholm'], 'pop': [532724, 9683248], 'countries': ['Suriname', 'Sweden']}

...如果您可以确定所有词典共享相同的键,这里有一个oneliner:

>>> {translations.get(k,k):[d[k] for d in list_countries] for k in list_countries[0].keys()}
{'national_anthem': ['God zij met ons Suriname', 'Du gamla, Du fria'], 'capital_city': ['Paramaribo', 'Stockholm'], 'pop': [532724, 9683248], 'countries': ['Suriname', 'Sweden']}

答案 3 :(得分:0)

这就是我所做的。唯一的限制是新词典中的键没有语法复数,但我想你最后可以手动完成。

list_countries = [{'country' : 'Suriname', 
            'population' : 532724,
            'capital': 'Paramaribo', 
            'anthem': 'God zij met ons Suriname'},
            {'country' : 'Sweden', 
            'population' : 9683248,
            'capital': 'Stockholm', 
            'anthem': 'Du gamla, Du fria'},
             ]


from collections import defaultdict
d = defaultdict(list)
for i in list_countries:
   for k,v in i.items():
     d[k].append(v)

d可以轻松地转换回常规dict

答案 4 :(得分:0)

keys =  list_countries[0].keys()
values = (list(t) for t in zip(*[d.values() for d in list_countries]))
dict(zip(keys, values))