根据值内的条件将(有序)字典的值分组

时间:2019-08-28 07:59:20

标签: python-2.7 dictionary ordereddict

我有一个已排序的字典(准确地说是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']
}

在这里,我想将“结束”值(第三个值,在这里为“ 350”)与下一个键的“开始”值(第二个值,在这里为“ 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,这是我在网上可以找到的最相似的图片,但我认为这并不真正适用于我的情况吗?

任何帮助将不胜感激。我拥有的orderdict首先在组(a或b)上排序,然后基于起始值进行排序。

1 个答案:

答案 0 :(得分:1)

以下代码应该可以工作,为方便起见,我对结果的数据结构进行了一些更改。

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(list(sorted_dict.values()))
result = dict()

result[values[0][0]] = [[values[0][3]]]

for i, list_1 in enumerate(values[:-1]):
    list_2 = values[i + 1]
    start, end = list_2[1], list_1[2]
    if list_1[0] == list_2[0]:
        # assuming start >= end, otherwise use abs(start - end)
        if start - end < 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']]}