根据值内的条件对(有序)字典的值进行分组
group values of (ordered) dictionary based on condition within values
我有一个排序字典(准确地说是 orderedDict),我想制作一个新字典(或编辑旧字典),根据条件对特定值进行分组。主要问题是我需要检查字典中的每个键与之前的键并将(多个)条目组合在一起,直到条件不再为真。我知道这一点我很模糊,所以这是一个例子
{
'5': ['a', 300, 350, 'name1'],
'98': ['a', 370, 450, 'name2'],
'115': ['a', 540, 600, 'name3'],
'7': ['a', 900, 960, 'name4'],
'12': ['a', 980, 1200, 'name5'],
'24': ['a', 2000, 2200, 'name6'],
'25': ['b', 100, 150, 'name7'],
'100': ['b', 190, 270, 'name8'],
'200': ['b', 280, 350, 'name9'],
'99': ['b', 370, 500, 'name10'],
'4': ['b', 980, 1200, 'name11']
}
这里我想比较 "end" 值(第三个值,这里是“350”)和下一个键的 "start" 值(第二个值,这里是“370”)和另外在 a 组或 b 组中(如果这太复杂了,我也可以制作 2 个不同的词典,反正只有 2 个组)。例如,如果结束和开始之间的差异小于 100,则将它们添加到一个组中。继续添加,直到条件不再为真。之后我的新字典中不需要所有值。所以一个可能的结果可能是。
{
'Group_1': ['a', 'name1; name2; name3'],
'Group_2': ['a', 'name4; name5'],
'Group_3': ['a', 'name6'],
'Group_4': ['b', 'name7; name8; name9; name10'],
'Group_5': ['b', 'name11']
}
我真的在考虑一个解决方案,但我唯一能想到的就是循环
for key[i], value[i] in sorted_dict.iteritems():
check key[i] with key[i-1]
if <100
new_dict[counter] = [list of combined values]
但这似乎很不合逻辑,因为那样你最多只能拥有一组长度为 2 的组,而且我认为很难针对不同的长度进行编程。我也认为我根本不应该在字典中这样做,但是我的python知识在如何解决这个问题上有点短,理论上很简单,但在数据结构问题上很难处理。
我看了这个post,这是我在网上能找到的最相似的,但我觉得不太适合我的情况?
如有任何帮助,我们将不胜感激。我拥有的 ordereddict 首先在组(a 或 b)上排序,然后根据起始值排序。
尽管我将数据结构更改为更紧凑,但以下代码将产生类似于您所描述的结果:
sorted_dict = {
'5': ['a', 300, 350, 'name1'],
'98': ['a', 370, 450, 'name2'],
'115': ['a', 540, 600, 'name3'],
'7': ['a', 900, 960, 'name4'],
'12': ['a', 980, 1200, 'name5'],
'24': ['a', 2000, 2200, 'name6'],
'25': ['b', 100, 150, 'name7'],
'100': ['b', 190, 270, 'name8'],
'200': ['b', 280, 350, 'name9'],
'99': ['b', 370, 500, 'name10'],
'4': ['b', 980, 1200, 'name11']
}
values = sorted(sorted_dict.values())
result = {values[0][0] : [[values[0][3]]]}
for list_1, list_2 in zip(values[:-1], values[1:]):
if list_1[0] == list_2[0]:
# assuming list_1[2] >= list_1[2], otherwise use abs(list_1[2] - list_1[2])
if list_2[1] - list_1[2] < 100:
result[list_1[0]][-1] += [list_2[3]]
else:
result[list_1[0]] += [[list_2[3]]]
else:
result[list_2[0]] = [[list_2[3]]]
print(result)
结果:
> {'a': [['name1', 'name2', 'name3'], ['name4', 'name5'], ['name6']], 'b': [['name7', 'name8', 'name9', 'name10'], ['name11']]}
我有一个排序字典(准确地说是 orderedDict),我想制作一个新字典(或编辑旧字典),根据条件对特定值进行分组。主要问题是我需要检查字典中的每个键与之前的键并将(多个)条目组合在一起,直到条件不再为真。我知道这一点我很模糊,所以这是一个例子
{
'5': ['a', 300, 350, 'name1'],
'98': ['a', 370, 450, 'name2'],
'115': ['a', 540, 600, 'name3'],
'7': ['a', 900, 960, 'name4'],
'12': ['a', 980, 1200, 'name5'],
'24': ['a', 2000, 2200, 'name6'],
'25': ['b', 100, 150, 'name7'],
'100': ['b', 190, 270, 'name8'],
'200': ['b', 280, 350, 'name9'],
'99': ['b', 370, 500, 'name10'],
'4': ['b', 980, 1200, 'name11']
}
这里我想比较 "end" 值(第三个值,这里是“350”)和下一个键的 "start" 值(第二个值,这里是“370”)和另外在 a 组或 b 组中(如果这太复杂了,我也可以制作 2 个不同的词典,反正只有 2 个组)。例如,如果结束和开始之间的差异小于 100,则将它们添加到一个组中。继续添加,直到条件不再为真。之后我的新字典中不需要所有值。所以一个可能的结果可能是。
{
'Group_1': ['a', 'name1; name2; name3'],
'Group_2': ['a', 'name4; name5'],
'Group_3': ['a', 'name6'],
'Group_4': ['b', 'name7; name8; name9; name10'],
'Group_5': ['b', 'name11']
}
我真的在考虑一个解决方案,但我唯一能想到的就是循环
for key[i], value[i] in sorted_dict.iteritems():
check key[i] with key[i-1]
if <100
new_dict[counter] = [list of combined values]
但这似乎很不合逻辑,因为那样你最多只能拥有一组长度为 2 的组,而且我认为很难针对不同的长度进行编程。我也认为我根本不应该在字典中这样做,但是我的python知识在如何解决这个问题上有点短,理论上很简单,但在数据结构问题上很难处理。
我看了这个post,这是我在网上能找到的最相似的,但我觉得不太适合我的情况?
如有任何帮助,我们将不胜感激。我拥有的 ordereddict 首先在组(a 或 b)上排序,然后根据起始值排序。
尽管我将数据结构更改为更紧凑,但以下代码将产生类似于您所描述的结果:
sorted_dict = {
'5': ['a', 300, 350, 'name1'],
'98': ['a', 370, 450, 'name2'],
'115': ['a', 540, 600, 'name3'],
'7': ['a', 900, 960, 'name4'],
'12': ['a', 980, 1200, 'name5'],
'24': ['a', 2000, 2200, 'name6'],
'25': ['b', 100, 150, 'name7'],
'100': ['b', 190, 270, 'name8'],
'200': ['b', 280, 350, 'name9'],
'99': ['b', 370, 500, 'name10'],
'4': ['b', 980, 1200, 'name11']
}
values = sorted(sorted_dict.values())
result = {values[0][0] : [[values[0][3]]]}
for list_1, list_2 in zip(values[:-1], values[1:]):
if list_1[0] == list_2[0]:
# assuming list_1[2] >= list_1[2], otherwise use abs(list_1[2] - list_1[2])
if list_2[1] - list_1[2] < 100:
result[list_1[0]][-1] += [list_2[3]]
else:
result[list_1[0]] += [[list_2[3]]]
else:
result[list_2[0]] = [[list_2[3]]]
print(result)
结果:
> {'a': [['name1', 'name2', 'name3'], ['name4', 'name5'], ['name6']], 'b': [['name7', 'name8', 'name9', 'name10'], ['name11']]}