2014-02-22 73 views
1

我想寫一些Python函數生成一個批處理輸入文件,其中有,例如,該塊:蟒蛇下令字典與重複鍵

***behavior 
**energy_phase_1 
ef_v 10 
**energy_phase_2 
ef_v 7. 

到目前爲止,我是用集合.OrderedDict,因爲訂單在這種輸入文件中很重要)。舉例來說,如果有兩個模擬在我的批處理:

inp_dict['***behavior'] = [ '', ''] 
inp_dict['**energy_phase_1'] = [ '', ''] 
inp_dict['**ef_v'] = [ '10', '20'] 
inp_dict['**energy_phase_2'] = [ '', ''] 
inp_dict['**ef_v'] = [ '7', '14'] 

和寫入文件,我只想做這樣的事情:

for s , n in enumerate(sim_list): 
    ......some code... 
    inp_file.write(' '.join([ key, val[s], '\n' for key, val in inp_dict.items])) 

但正如你所看到的,這是不夠的,因爲它在字典中有重複鍵。

所以我的問題是:是否有一個有序的字典,允許重複鍵?例如,如果存在dict ['key'] = 1且dict ['key'] = 2,則第一次調用將返回1和第二次?

或者,有沒有一些聰明和簡單的方法來實現我想要的?

感謝

+1

爲什麼不把dict ['key']保存爲數組,例如[1,2]?然後,您可以爲一個鍵擁有多個值,而不是具有不同值的多個鍵。 –

+0

因爲dict ['key']已經是一個數組了,因爲我有inp_dict ['** ef_v'] = [sim 1的值='10',sim2的值爲'20'],以及inp_dict [ ** ef_v'] = [sim 1的值='7',sim2的值='14'],其中有不同的***塊。 – Napseis

+0

如果真的想要,可以實現一個像所描述的類似字典的對象。您可能繼承ABC的'collections.Mapping'或'collections.MutableMapping',在內部將多值作爲列表字典存儲,並將索引維護到每個列表的最後一個返回元素。但是,在關鍵查找時返回不同的內容感覺很不明確,並且肯定會違反用戶的標準期望。我強烈建議重新思考這個想法。如果你有不同的值,這些鍵是否真的相同?你能做一個簡單的列表字典並迭代返回的列表嗎? –

回答

1

概念重複鍵違背字典的概念。

如果您需要維護訂單有重複鍵我會說你需要使用另一個數據結構。一種可能的解決方案是使用元組列表。像下面這樣:

inp = list() 

# Define your input as a list of tuples instead of as a dict 

inp.append(('***behavior', ('', ''))) 
inp.append(('**energy_phase_1', ('', ''))) 
inp.append(('**ef_v', ('10', '20'))) 
inp.append(('**energy_phase_2', ('', ''))) 
inp.append(('**ef_v', ('7', '14'))) 

# You can have duplicate keys on the list and the order is preserved 

output = "\n".join(["{key} {val}".format(key=t[0], val=t[1][0]).strip() for t in inp]) 

在這種情況下,output變量將包括:

***behavior 
**energy_phase_1 
**ef_v 10 
**energy_phase_2 
**ef_v 7 

如果需要通過密鑰(類似字典的功能),你可以使用類似這樣來訪問值:

def get_key_values(inp, key): 

    filtr_by_key = filter(lambda t: True if t[0] == key else False, inp) 
    return filtr_by_key 

ef_v_values = get_key_values(inp, "**ef_v") 

在這種情況下,ef_v_values將只包含與該鍵**ef_v關聯的值:

[('**ef_v', ('10', '20')), ('**ef_v', ('7', '14'))] 

希望這會有所幫助。

+0

感謝您的回答。我知道這與字典哲學背道而馳,但它感覺像字典和元組對象之間缺乏一些東西。目前我還沒有得到第二個例子,但也許晚上會更清楚。 – Napseis

+0

第二個例子僅僅是一個幫助函數,以防你需要通過鍵訪問包含在* inp *中的模擬結果(字典中的內容很簡單:inp [key])。對你的問題真正的「答案」只是第一部分:) – agmangas