从列表字典到两个相同长度的列表

时间:2015-08-13 13:39:55

标签: python python-3.x dictionary

考虑以下词典:

if ($_POST['content'] == 'xxx') {

}
else if ( /*etc..*/ ) {}

我想将其转换为两个列表或元组:

{'key1': ['PTRG0097',
         'CPOG0893',
         'MMUG0444',
         'BTAG0783'],
'key2': ['CPOG0893',
         'MMUG0444',
         'PPYG0539',
         'BTAG0083']}

如果没有在Python 3中循环,可能有一种简单的方法可以做到这一点,但我发现的一些解决方案(例如Split dictionary of lists into single lists)并没有以这种方式扩展dict。

4 个答案:

答案 0 :(得分:3)

如果没有显式循环并假设使用Python3,这就是人们如何做到的。

>> list(zip(*[(k, v) for k, vs in d.items() for v in vs]))
[('key2', 'key2', 'key2', 'key2', 'key1', 'key1', 'key1', 'key1'),
 ('CPOG0893',
  'MMUG0444',
  'PPYG0539',
  'BTAG0083',
  'PTRG0097',
  'CPOG0893',
  'MMUG0444',
  'BTAG0783')]

仅需要初始调用list来打印迭代器。如果要将值保存在变量中,则不需要它:

[keys, values] = zip(*[(k, v) for k, vs in d.items() for v in vs])

答案 1 :(得分:2)

如果没有循环,这是不可能的,但是你可以在没有显式循环的情况下做到这一点:

inflate()

在实践中,你当然会选择musically_ut的答案,而不是这个难以理解的废话。

答案 2 :(得分:1)

您可以通过这种方式获取键和值的元组列表:

key_values = [(k, v) for k, vs in a.items() for v in vs]

然后从列表中获取一个键和值的列表,如果这更有价值:

keys = [i[0] for i in key_values]
values = [i[1] for i in key_values]

答案 3 :(得分:1)

keys = ['key1' for x in d['key1']] + ['key2' for x in d['key2']]
values = d['key1'] + d['key2']

虽然,我认为可能是一个简单的版本的键'不使用列表推导的行。