具有重复键的python有序dict

具有重复键的python有序dict,python,data-structures,dictionary,duplicates,Python,Data Structures,Dictionary,Duplicates,我试图编写一些python函数来生成一批输入文件,例如,其中有以下代码块: ***behavior **energy_phase_1 ef_v 10 **energy_phase_2 ef_v 7. 到目前为止,我使用的是collections.OrderedDict,因为在这种输入文件中,顺序很重要)。例如,如果我的批处理中有两个模拟: 要编写文件,我只需执行以下操作: 但正如您所看到的,这是不够的,因为dict中有重复的键 所以我的问题是:是否存在允许复制密钥的有序dict?例如,如果

我试图编写一些python函数来生成一批输入文件,例如,其中有以下代码块:

***behavior
**energy_phase_1
ef_v 10
**energy_phase_2
ef_v 7.
到目前为止,我使用的是collections.OrderedDict,因为在这种输入文件中,顺序很重要)。例如,如果我的批处理中有两个模拟:

要编写文件,我只需执行以下操作:

但正如您所看到的,这是不够的,因为dict中有重复的键

所以我的问题是:是否存在允许复制密钥的有序dict?例如,如果存在dict['key']=1和dict['key']=2,则第一个调用将返回1,第二个调用将返回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])
在这种情况下,
输出
变量将包含:

***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\u v\u值
将仅包含与键相关的值
**ef\u v

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

希望这有帮助。

为什么不将dict['key']作为一个数组保存,例如[1,2]?因为dict['key']已经是一个数组,因为我有inp_dict[''**ef_v']=[sim 1的值='10',sim2的值='20'],以及inp_dict['**ef_v']=[sim 1的值='7',sim2的值='14'],这是一个不同的***块的集合。如果你真的想要,你可以实现一个类似dict的对象,它可以按照描述工作。您可能会对ABC
集合.Mapping
集合.MutableMapping
进行子类化,将多个值作为列表的dict进行内部存储,并维护每个列表最后返回元素的索引。然而,在键查找中返回不同的内容感觉很不明确,并且肯定会与用户的标准期望相违背。我强烈建议重新考虑这个想法。如果有不同的值,这些键真的相同吗?你能简单地记录一下列表并重复返回的列表吗?谢谢你的回答。我知道这违背了dict的哲学,但感觉dict和tuple对象之间缺少一些东西。我现在还不太明白第二个例子,但也许晚上会更清楚。第二个例子只是一个助手函数,以防您需要通过键访问inp中包含的模拟结果(dict中的一些内容很简单:inp[key])。你问题的真正“答案”只是第一部分:)
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', ('10', '20')), ('**ef_v', ('7', '14'))]