Python 从O(n)中的列表生成分类数据集

Python 从O(n)中的列表生成分类数据集,python,algorithm,Python,Algorithm,我试图从属性为prop1和prop2的项目列表中生成具有以下结构的数据集: result[p1][p2]=>prop1=p1和prop2=p2的项目列表 我已经能够在O(n2)中通过以下方式完成: 但我没能找到一个在更短时间内完成的方法。是否有可能在O(n)中实现这一点?您只需在项目上迭代一次: from collections import defaultdict result = defaultdict(lambda: defaultdict(list)) for item in item

我试图从属性为
prop1
prop2
的项目列表中生成具有以下结构的数据集:

result[p1][p2]=>prop1=p1和prop2=p2的项目列表

我已经能够在O(n2)中通过以下方式完成:


但我没能找到一个在更短时间内完成的方法。是否有可能在O(n)中实现这一点?

您只需在项目上迭代一次:

from collections import defaultdict

result = defaultdict(lambda: defaultdict(list))
for item in item_list:
    result[item.prop1][item.prop2].append(item)

您只需在项目上迭代一次:

from collections import defaultdict

result = defaultdict(lambda: defaultdict(list))
for item in item_list:
    result[item.prop1][item.prop2].append(item)

使用
dict
(与
defaultdict
相反)的解决方案:


使用
dict
(与
defaultdict
相反)的解决方案:


那不太管用。您需要使用
defaultdict(lambda:defaultdict(list))
。在您的版本中,
result[item.prop1]
将是一个列表,因此尝试访问
result[item.prop1][item.prop2]
可能会失败。您完全正确-我忽略了它是一个2d矩阵。固定的!那不太管用。您需要使用
defaultdict(lambda:defaultdict(list))
。在您的版本中,
result[item.prop1]
将是一个列表,因此尝试访问
result[item.prop1][item.prop2]
可能会失败。您完全正确-我忽略了它是一个2d矩阵。固定的!
result = {}
for item in item_list:
    result.setdefault(item.prop1, {}).setdefault(item.prop2, []).append(item)