2015-08-13 123 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。

相關問題