我有一个defaultdict(dict)的嵌套字典,其子字典将int键和list s(int s的列表)作为值,

'A' = {2092: [1573], 2093: [1576, 1575], 2095: [1577], 2097: [1574]}
'B' = {2098: [1], 2099: [2, 3], 2101: [4], 2102: [5]}
'C' = {2001: [6], 2003: [7, 8], 2008: [9], 2009: [10]}


我想连续连接两个子键值(列表),如果它们对应的子键是连续的,这意味着它们的差小于或等于预定义的距离,例如两个连续键之间的差小于或等于2或3,...例如将距离设置为2并将合并列表放入另一个列表时,最后一个列表看起来像,

[1573, 1576, 1575, 1577, 1574]
[1, 2, 3, 4, 5]
[6, 7, 8]
[9, 10]


对于A2092209320952097是连续的,因为它们的差异为[1573, 1576, 1575, 1577, 1574]。对于C,由于20012003的区别是[6,7,8],所以将它们合并到2中;由于2003的区别,20085没有被合并。

根据Detecting consecutive integers in a list

以下代码仅在两个键之间的差异为1时才有效。

results = []
for key, sub_dict in d.items():
    sub_dict_keys = sorted(sub_dict.keys())
    for k, g in groupby(enumerate(sub_dict_keys), lambda ix: ix[0] - ix[1]):
        consecutive_keys = list(map(itemgetter(1), g))
        val_list = []

        for dict_key in consecutive_keys:
            val_list.extend(sub_dict[dict_key])

        results.append(val_list)

print(results)


我想知道如何使代码占任意距离。

最佳答案

如何使用:

dist = 2

results = []
for sub_dict in d.values():
    sub_dict_keys = sorted(sub_dict.keys())
    l = []
    for k in sub_dict_keys:
        if l and k > prev_key + dist:
            results.append(l)
            l = []
        l.extend(sub_dict[k])
        prev_key = k
    if l:
        results.append(l)

print(results)


这很干净,不需要导入模块,但是如果任何列表为空(即它们不会被附加到result),效果都不好。

关于python - python字典连接成对差异在一定距离内的连续键的值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47179055/

10-11 22:29
查看更多