python命令dict与重复键

时间:2014-02-22 21:35:36

标签: python data-structures dictionary duplicates

我正在尝试编写一些python函数来生成一批输入文件,例如,这个块有一个:

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

到目前为止,我使用的是collections.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和第二次2?

或者,是否有一些聪明而简单的方法来实现我想要的?

由于

1 个答案:

答案 0 :(得分:2)

重复密钥的概念违反了dict的概念。

如果您需要维护订单有重复的密钥,我会说您需要使用其他数据结构。一种可能的解决方案是使用元组列表。如下所示:

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

如果您需要按密钥访问值(类似dict的功能),您可以使用以下内容:

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

希望这有帮助。