繁体   English   中英

如何将索引处的元素动态添加到 Python 列表?

[英]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) ,其中nmlist1list2的大小。

appendO(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']

或者joinsplit

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM