2015-07-28 43 views
2

的值列表的項目我有這樣交流與字典的Python

data = [ 
    { 
     "B3": 0.9500000000000000 
    }, 
    { 
     "C3": 0.9000000000000000 
    }, 
    { 
     "D3": 0.8900000000000000 
    }, 
    { 
     "E3": 0.8800000000000000 
    }, 
    { 
     "F3": 0.8700000000000000 
    }, 
    { 
     "G3": 0.8600000000000000 
    }, 
    { 
     "H3": 0.8500000000000000 
    }, 
    { 
     "I3": 0 
    }, 
    { 
     "J3": 0 
    }, 
    { 
     "K3": 0 
    }, 
    { 
     "L3": 0 
    }, 
    { 
     "M3": 0 
    } 
] 

和司機字典這樣

driver = { 
    1: [600.0, 625.0, 700.0, 650.0, 660.0, 800.0, 675.0, 650.0, 600.0, 700.0, 690.0, 750.0], 
    2: [580.0, 607.0, 685.0, 626.0, 640.0, 770.0, 665.0, 639.0, 595.0, 665.0, 675.0], 
    3: [560.0, 589.0, 670.0, 602.0, 620.0, 740.0, 655.0, 628.0, 590.0, 630.0], 
    4: [540.0, 571.0, 655.0, 578.0, 600.0, 710.0, 645.0, 617.0, 585.0], 
    5: [520.0, 553.0, 640.0, 554.0, 580.0, 680.0, 635.0, 606.0], 
    6: [500.0, 535.0, 625.0, 530.0, 560.0, 650.0, 625.0], 
    7: [480.0, 517.0, 610.0, 506.0, 540.0, 620.0], 
    8: [460.0, 499.0, 595.0, 482.0, 520.0], 
    9: [440.0, 481.0, 580.0, 458.0], 
    10: [420.0, 463.0, 565.0], 
    11: [400.0, 445.0], 
    12: [380.0] 
} 

我需要每一個數據的按鍵映射詞典列表列表中的字典與驅動程序字典的值。

樣本輸出應該是這樣的

{ 
    'B3': [600.0, 625.0, 700.0, 650.0, 660.0, 800.0, 675.0, 650.0, 600.0, 700.0, 690.0, 750.0], 
    'C3': [580.0, 607.0, 685.0, 626.0, 640.0, 770.0, 665.0, 639.0, 595.0, 665.0, 675.0] 
} 

等。

我的方法是首先將字典列表轉換爲鍵列表,然後迭代驅動程序字典中的每個項目並彈出該項目,並用新列表中的鍵替換它。

from collections import Iterable 

k_list = [] 
for item in data: 
    k_list.append(list(item.keys())) 

print(k_list) 


def flatten(items, ignore_types=(str, bytes)): 
    for x in items: 
     if isinstance(x, Iterable) and not isinstance(x, ignore_types): 
      yield from flatten(x) 
     else: 
      yield x 


x = list(flatten(k_list)) 
print(x) 

nn = {} 
for k, v in driver.items(): 
    for i in x: 
     nn[i] = v 

print(nn) 

這給了我這樣的

{'L3': [380.0], 'C3': [380.0], 'D3': [380.0], 'E3': [380.0], 'G3': [380.0], 'M3': [380.0], 'B3': [380.0], 'I3': [380.0], 'F3': [380.0], 'H3': [380.0], 'K3': [380.0], 'J3': [380.0]} 

輸出我哪裏做錯了?

NOTE:排序很重要,即數據字典的B3應與驅動程序字典的1匹配等。

+0

驅動程序中的密鑰是否總是從1到n的數字並排序? –

+0

'{next(iter(data_item)):驅動程序[驅動程序密鑰] for data_item,驅動程序密鑰在zip(數據,排序(驅動程序))}' – falsetru

+0

@tobias_k是的,它們總是有序的。 – PyAn

回答

0

第一,而不是僅僅使用driver.items()你應該使用sorted,以確保該項目是在正確的順序(他們應該進行反正排序,但也不能保證爲)。然後,而不是使用嵌套循環,您應該鍵和驅動程序數據。最後,要確保生成的字典是有序的(如果這很重要),請使用OrderedDict

k_list = [k for item in data for k in item.keys()] 
nn = collections.OrderedDict() 
for k, (n, v) in zip(k_list, sorted(driver.items())): 
    nn[k] = v 

與嵌套循環方法的問題是,你重寫所有以最後一次迭代的最後一個值的鍵