【问题标题】:How to insert values at specific index in defaultdict in Python3 [closed]如何在 Python3 中的 defaultdict 中的特定索引处插入值 [关闭]
【发布时间】:2018-03-27 16:39:29
【问题描述】:

我是 Python 的初学者,我正在尝试使用 defaultdict 在与我在 Python 3 中的键关联的值列表中的特定索引中添加一个元素。

我的 default_dict 结构如下:

default_dict = ['label_1':[list of doubles], 'label_2':[list of doubles], etc..]

假设我有一个双 d = 6.5 并且我想将它作为带有键的列表的值插入:label_1 在特定索引中。

如果我的列表是:[12.3, 11.8, 8.6, 5.8, 3.1]

我想在8.65.8 之间插入我的d = 6.5

我知道像default_dict[label_1].append(d) 这样的调用会产生这样的列表:

[12.3, 11.8, 8.6, 5.8, 3.1, 6.5]

有没有我可以使用的功能: default_dict[label_1].add(d, index_to_insert) ?

我想我可以获取整个列表,自己修改它并用旧的切换新列表,但我认为这是一个繁重的调用(我需要调用很多时间)并且我需要更多有效的方法!

提前致谢!

【问题讨论】:

  • default_dict['label_1'].insert(3, 6.5) 做你想做的事吗?目前尚不清楚您是尝试在特定索引处还是在两个特定值(如 8.6 和 5.8)之间插入值。
  • 您找不到有关如何将值插入列表的文档?
  • @Aran-Fey 我正在尝试构建一个从高到低的双精度排序列表,而不使用排序功能。每次我得到一个值时,我都会检查列表并将这个值插入到它所属的索引中。在我的示例中,6.5 介于 8.6 和 5.8 之间,因为 6.5 小于 8.6 且大于 5.8。索引每次都会变化。价值每次都在变化。
  • @Prune 如果我成功地找到了解释我需要什么的文档,我不会在 SO 上问这个问题 ;)
  • ...这不是它的工作原理。你不能仅仅因为其他人理解你的意思而忽略这个问题。 StackOverflow 问题必须清晰有用。如果读者无法说出您的问题是什么,则该问题没有持久价值,应该关闭/删除。

标签: python python-3.x list append defaultdict


【解决方案1】:

使用list.insert(index,object) 添加到列表的特定索引。

请注意,您必须对 default_dict 中的内部列表执行此操作。

例如:

>>li1 = [1,2,3,4,5]
>>li1.insert(5,8)
>>li1
[1, 2, 3, 4, 5, 8]
>>li1.insert(1,99)
>>li1
[1, 99, 2, 3, 4, 5, 8]

更有效的方法也是slicing,如果您在特定索引处插入单个或多个元素而不替换现有值。

>>li1 = [1,2,3,9,6,4,9,0]
>>li1[3:3] = [7]
>>li1
[1, 2, 3, 7, 9, 6, 4, 9, 0]

请注意time complexity for insertO(n)slicingO(k)

【讨论】:

  • 也许值得注意的是,这是最坏情况下的O(n) 操作,而append 是最坏情况下的O(1)
  • 是的,好点。 OP想要插入特定的索引,我们有像log(n)这样的东西吗?
  • @Prateek 但是你需要做li1[:i] + [8] + li1[i:]。这两个切片已经是O(k+l),与k+l = n。并且列表添加可能至少会再次增加一倍,因为它需要创建两个新列表(为它们和所有列表分配内存)。
  • @Basionkler list.insert 是一种修改列表实例的方法。你不需要重新分配它(事实上,如果你这样做,它将是None,因为按照约定,就地修改对象的方法返回None,而不是修改后对象的副本)。
  • 如果你有很多插入,可以工作的一件事是append它们全部,然后最后sort列表(因为看起来OP想要在它的位置插入元素如果列表需要保持排序,就会去)。这将是一个O(n*log(n)),而不是k*O(n) 插入k。但在这种情况下,您可能还是想使用最小堆。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-08
  • 2019-10-06
  • 1970-01-01
  • 1970-01-01
  • 2019-11-20
  • 2022-01-25
  • 2013-09-11
相关资源
最近更新 更多