python - 将值添加到同一字典中的键

标签 python list python-3.x dictionary

这将是我的输入

{1: [2, 3], 2: [1, 7], 3: [1], 7: [1]}

输出:

{1: [2, 3, 1, 7, 1], 2: [1, 7, 2, 3, 1, 7, 1, 1], 3: [1, 2, 3, 1, 7, 1],
 7: [1, 2, 3, 1, 7, 1]}

这里发生的是对于每个 key , value values在给定 key 的值列表内将充当键本身以及与新的 key 相对应的值应附在原文之后。

现在让我说得非常清楚。以此为例。

simple_dict={1:[2,3],2:[7],3:[1],7:[1]}这里将使用一把 key ,比如 1现在它的所有值 2 , 3本身将充当 key 。所以simple_dict[2] , simple_dict[3]将被添加到原始 key 中,以便我得到 1:[2,3,7,1]这样的。对于所有键都应该以同样的方式完成此操作。

目前我尝试过这个!

my_dict = {1:[2,3],2:[7],3:[1],7:[1]}
print(my_dict)
for k,v in my_dict.items():
    for i in v:
        my_dict[k]=my_dict[k]+my_dict[i]
print(my_dict)

输出:

{1: [2, 3], 2: [7], 3: [1], 7: [1]}
{1: [2, 3, 7, 1], 2: [7, 1], 3: [1, 2, 3, 7, 1], 7: [1, 2, 3, 7, 1]}

这效果很好。但时间复杂度好像是O(n^2)

(我对时间复杂度的理解是否正确,即这将是 O(n^2) 复杂度?或者会比这小得多?)

我想做的事情有更简单的方法吗?非常欢迎任何建议、想法。

最佳答案

This works well and good. But the time complexity seems to be O(n2)

实际上更糟:时间复杂度为O(n3),因为将两个列表添加在一起将在内完成>O(n) 时间,并且对每个键都执行 O(n) 时间(这又是 O(n))。

尽管如此,这里还有另一个问题更新顺序很重要:因为您写入my_dict[k],这意味着如果您处理新项目,字典将已更新。这可能不是预期的行为。

这里你能做的最好的事情就是构建一个O(n2)算法(假设你不创建函数式编程列表),因为输出可以生成一个对象大小O(n2),对此你无能为力,它是“理论下限”(除非,如前所述,你工作带有指向不可变数据结构的指针,但这些不再是列表)。

您可以制作一个优雅的列表理解,它可以在 O(n2) 中工作:

{k:vs+[vi for v in vs for vi in my_dict[v]] for k,vs in my_dict.items()}

这将构造:

>>> { k : vs + [vi for v in vs for vi in my_dict[v]] for k,vs in my_dict.items()}
{1: [2, 3, 1, 7, 1], 2: [1, 7, 2, 3, 1], 3: [1, 2, 3], 7: [1, 2, 3]}

它假设字典列表中的所有索引都是有效索引:这些索引都在字典中。如果情况并非总是如此,您可以使用以下表达式使程序更加安全:

{k:vs+[vi for v in vs for vi in my_dict.get(v,())] for k,vs in my_dict.items()}

现在我们添加了 () 作为后备值,这样当找不到键时,它不会向列表中添加任何内容。

关于python - 将值添加到同一字典中的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44653153/

相关文章:

python - 多重处理 - 生产者/消费者设计

python - 如何在 SQLAlchemy 中过滤列上的 SQL 查询?

python - 属性错误 : 'MSVCCompiler' object has no attribute 'linker_exe'

performance - 从python中的列表中获取哈希的最快方法

c - 结构列表中的内存错误(存储未知)

python - 多重网格泊松求解器

java - 搜索对象特定属性的最佳方法

python - 使用 ScraperWiki 抓取 PDF 并收到未定义错误

python - 未从 PyPDF2 上的正则表达式接收 PDF 的正确模式

python - 如何使用 POST 请求(请求和 python3)提交联系表单?