我有一个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]
答案 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。叶元素是空字典,可以在以后填充。