如何将嵌套列表(python)分组到字典中?

时间:2017-06-23 22:02:46

标签: python list dictionary grouping

我有一个Python列表,我希望将它们集成到一个更连贯的有序词典中。

数据格式如下:

import Foundation

enum APITextEncoding : String
{
    case iso8859_1 = "iso-8859-1"
    // etc.

    var encoding: String.Encoding
    {
        switch self
        {
            case .iso8859_1:
                return .isoLatin1
            // etc.
        }
    }
}

let receivedEncoding = APITextEncoding(rawValue: encodingDescription)
let receivedText = String(data: receivedData, encoding: receivedEncoding.encoding)

最终,我希望得到的是某种字典结构,它是通过列表进行搜索并根据第一,第二,第三等级别的相同项目进行分类。

我一直在玩[ ['1_1', '2_1', '3_1', '4_1'], ['1_1', '2_1', '3_2', '4_1'], ['1_1', '2_2', '3_1', '4_1'], ['1_1', '2_2', '3_1', '4_2'], ['1_1', '2_2', '3_1', '4_3'], ['1_1', '2_2', '3_2', '4_1', '5_1'], ['1_1', '2_2', '3_2', '4_2', '5_1'], ['1_1', '2_2', '3_2', '4_2', '5_2'], and so on... ] 以尝试使用以下代码:

groupby

这适用于第一级,但我仍然坚持如何通过结构进行递归,以便在逐渐更深的层次上进行相同类型的分组。

任何想法都将不胜感激!

编辑:从投票判断来看,我认为这不是一个好问题吗?我认为预期的输出在我的描述中是清楚的,但为了明确,我正在寻找一棵非常类似于Delgan的代码产生的树:

_map = OrderedDict()
for key, group in groupby(big_list, lambda x: x[0]):  
    _map[key] = [l[1:] for l in group]

1 个答案:

答案 0 :(得分:1)

你真的不需要groupby()

这可以简单得多:只需迭代填充字典,同时迭代数据。

您也可以使用dict.setdefault()。这样可以避免检查密钥是否已存在于嵌套字典中。

map_ = {}  # Note the trailing instead of leading underscore here

for sub_list in big_list:
    dct = map_
    for item in sub_list:
        # Retrieve existing sub dict, or create a new one
        dct = dct.setdefault(item, {})

print(map_)

这实际上是在创建tree。叶元素是空字典,可以在以后填充。