[英]Reduce time complexity of pairwise dictionary construction
假设我有dict
slots = {
"a": {"a": "Data for A"},
"b": {"b": "Data for B"},
"c": {"c": "Data for c"},
}
和一份清单
numbers = [1, 2, 3]
现在我想要为每个嵌套的 dict 复制列表的长度时间,并用一些键添加列表的每个对象
像这样:
output = [
{"a": "Data for A", "number": 1},
{"a": "Data for A", "number": 2},
{"a": "Data for A", "number": 3},
{"b": "Data for B", "number": 1},
{"b": "Data for B", "number": 2},
{"b": "Data for B", "number": 3},
{"c": "Data for c", "number": 1},
{"c": "Data for c", "number": 2},
{"c": "Data for c", "number": 3},
]
我通过使用以下代码实现了所需的输出:
output = []
for key in slots:
for number in numbers:
data = slots[key].copy()
data["number"] = number
output.append(data)
但这里的问题是时间复杂度在这种情况下是O(n^2)我希望它减少到O(n)或O(n log n)我做了太多的头脑风暴和搜索,但找不到合适的解决方案。 我发现的一件事是
但不知道如何在我的情况下使用它。 可能是维护索引的另一个命令,但我无法弄清楚我该怎么做。
任何帮助将不胜感激,谢谢!
O(n * m)
更好。 (其中n
是字典列表的长度, m
是numbers
列表的长度。)
您需要O(n * m)
内存才能存储结果,并且我们需要遍历每个列表中的每对元素以在最终结果中生成其对应的字典。 单独迭代每一对需要O(n * m)
时间,因此给出了算法运行速度的下限。
您可能想查看itertools.product()
- 对于您的用例,它可能会更快。 但是由于您要询问时间复杂度,因此可以给出的唯一(正确)答案是您所描述的内容是不可能的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.