[英]How to dynamically add elements at index to Python list?
给定一些 Python 列表,
list1 = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
对于包含在另一个列表中的某些字符,例如
list2 = ['a', 'd', 'e']
我需要在list1
中原始字符之前的索引中添加一个字符{char}1
,这样更新后的list1
如下所示:
list1 = ['a1', 'a', 'b', 'c', 'd1', 'd', 'e1', 'e', 'f', 'g']
我最初的想法是将原始元素的索引存储在字典中,然后insert
新元素插入到list1
中的[i-1]
中,
in range (1, len(list1)+1)
。 然而,我后来意识到这只适用于第一个元素,因为列表会增长并且索引会移动,所以我会得到错误的结果。
有没有一种有效的方法可以使用insert
来做到这一点?
一种方法:
list1 = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
list2 = ['a', 'd', 'e']
result = []
for e in list1:
if e in list2:
result.extend([f"{e}1", e])
else:
result.append(e)
print(result)
Output
['a1', 'a', 'b', 'c', 'd1', 'd', 'e1', 'e', 'f', 'g']
如果list2
很大,请考虑将其转换为set 。 像下面这样:
result = []
set2 = set(list2)
for char in list1:
if char in set2:
result.extend([f"{char}1", char])
else:
result.append(char)
第二种解决方案是预期的O(n + m) ,其中n和m是list1
和list2
的大小。
append
是O(1)
(这意味着操作成本是常数), extend
是重复的append
(并且在问题的上下文中也是常数)。 从文档中:
通过附加 iterable 中的所有项目来扩展列表。 等价于 a[len(a):] = 可迭代。
注意:使用insert
将使方法成为O(n * m) ,因为在列表中插入具有线性复杂性(请参见此处)。 线性复杂性来自列表必须移动元素的事实。
您可以使用 while 循环和枚举 function 来获得相同的结果。
index = 0
list1 = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
list2 = ['a', 'd', 'e']
while index < len(list1):
# Get the current character and its index
char, i = list1[index], index
if char in list2:
list1.insert(i, char + '1')
index += 2
else:
index += 1
print(list1)
insert
的另一种方法:
list1 = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
list2 = ['a', 'd', 'e']
for e in list2:
list1.insert(list1.index(e), f'{e}1')
list1
>>> ['a1', 'a', 'b', 'c', 'd1', 'd', 'e1', 'e', 'f', 'g']
itertools
的替代品:
from itertools import chain
list1 = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
list2 = ['a', 'd', 'e']
list1 = [*chain.from_iterable((i,[i+'1',i])[i in list2] for i in list1)]
# ['a1', 'a', 'b', 'c', 'd1', 'd', 'e1', 'e', 'f', 'g']
或者join
和split
:
list1 = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
list2 = ['a', 'd', 'e']
list1 = ' '.join([(i,' '.join([i+'1',i]))[i in list2] for i in list1]).split()
# ['a1', 'a', 'b', 'c', 'd1', 'd', 'e1', 'e', 'f', 'g']
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.