2015-08-13 77 views
2

考虑以下字典的:从列表的字典两个列表长度相同

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

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

keys = ['key1', 'key1', 'key1', 'key1', 'key2', 'key2', 'key2', 'key2'] 
values = ['PTRG0097', 'CPOG0893', 'MMUG0444', 'BTAG0783', 'CPOG0893', 'MMUG0444', 'PPYG0539', 'BTAG0083'] 

有可能是一个简单的方法在没有Python 3循环的情况下做到这一点,但我发现的一些解决方案(例如Split dictionary of lists into single lists)并没有像这样扩展字典。

+0

'没有循环?' – The6thSense

回答

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]) 
2

这是不可能不循环,但你可以做到这一点没有明确循环

from itertools import * 

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

def expand(k, vs): 
    return product([k], vs) 

print(list(zip(*chain.from_iterable(starmap(expand, d.items()))))) 

在实践中,你当然会用musically_ut的答案,而不是这个无法读懂的废话。

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] 
1
keys = ['key1' for x in d['key1']] + ['key2' for x in d['key2']] 
values = d['key1'] + d['key2'] 

虽然,我想可能有一个siimpler版本的'keys'行不使用list-comprehensions。

相关问题