在字符串列表中,为特定元素之前和之后插入一个元素。

10
当特定字符串出现时,是否可以向列表中插入内容。 例如:
List=['north','south','east','west','south','united']

所以每当字符串'south'出现时,列表将在该元素之前插入一个项'canada'

Results
List=['north','canada','south','east','west','canada','south','united']

编辑:非常抱歉我没有表述清楚。我需要它查找特定字符。

List1=['north','<usa>23<\usa>','east','west','<usa>1942<\usa>','united']
Result=['north','canada', '<usa>23<\usa>','east','west','canada','<usa>1942<\usa>','united']

你要找的是insert,而不是append这个问题可能会有所帮助,但你需要在列表遍历中加入条件语句。 - R Nar
你确定它是<\usa>而不是</usa>吗? - Willem Van Onsem
6个回答

12
为了能够将元素放置在列表中特定的位置,您需要使用 insert 函数。
<list>.insert(<position>, <value>)

举个例子,如果你有一个包含以下内容的列表:

a = [2, 4, 6, 8, 12]

如果你想要将10添加到列表中但保持当前顺序,可以这样做:

a.insert(4, 10)

并将获得:

[2, 4, 6, 8, 10, 12]

编辑

在每个“南方”之前插入以下内容:

for i in range(len(<list>)):
    if <list>[i] == 'south':
        <list>.insert(i, 'canada')

1
这并没有真正回答问题,我认为? - Willem Van Onsem
我理解插入函数,但是如何在我的列表中每个标有“南”字样的元素之前插入一个新元素? - user5651011
你认为循环 for i in range(len(..)) 真的可行吗?我认为你应该倒序循环,这样就不会移动尚未处理的项目。此外,使用 enumerate() 也是一个好选择。 - mirek

6

在另一个元素之前插入元素

>>> x = [1,2,3,4,5]
>>> x.insert(x.index(4), 22)
>>> x
[1, 2, 3, 22, 4, 5]

在另一个元素后插入元素

>>> x = [1,2,3,4,5]
>>> x.insert(x.index(3)+1, 22)
>>> x
[1, 2, 3, 22, 4, 5]

然而,这种方法无法用于多次插入操作。

>>> x = [1,2,3,4,5,4,6,4,7]
>>> x.insert(x.index(4), 22)
>>> x
[1, 2, 3, 22, 4, 5, 4, 6, 4, 7]

5
简单的回答是:
def blame_canada(old_list): 
    new_list = []
    for each in old_list:
        if each == 'south':
            new_list.append('canada')
        new_list.append(each)
    return new_list

4
不需要 else;因为你在任一分支中都添加了 each,所以将其无条件地执行即可。 - jscs

3
您可以使用双重列表推导式(使用您定义的类似于List的东西)来编写一个简单的一行代码:
>>> [inner for outer in [(['canada',x] if x == 'south' else [x]) for x in List] for inner in outer]
['north', 'canada', 'south', 'east', 'west', 'canada', 'south', 'united']

答案分为两个部分:
  • the inner list comprehension: [(['canada',x] if x == 'south' else [x]) for x in List] this iterates over the list and returns a list of lists. In case x is south, it emits ['canada','south'], otherwise it emits [x]. So the result is something like:

    >>> [(['canada',x] if x == 'south' else [x]) for x in List]
    [['north'], ['canada', 'south'], ['east'], ['west'], ['canada', 'south'], ['united']]
    

    for the given list.

  • Next the result is flattened using this approach.


3

使用简单的循环:

L = ['north','south','east','west','south','united']
res = []
for entry in L:
    if entry == 'south':
        res.append('canada')
    res.append(entry)
L[:] = res

最后一行将结果复制到原始列表中,使其等价于修改原始列表的append方法。如果使用大量的insert调用,对于大型列表来说会非常缓慢,因为每个插入都需要构建整个列表。

我没有表达清楚,但我理解了这个问题,我正在查找是否包含这些字母。然后我会添加,因为在我的实际列表中,将有数字附加到要查找的元素上。 - user5651011

1
这里有一个高性能的列表推导方法来完成这个任务。
首先,它生成一个包含"南"的索引列表。
然后,它使用索引+索引顺序作为插入点(以考虑循环中的先前插入),从而为此问题提供了一个简单、快速且易于遵循的Pythonic解决方案。
List = ['north','south','east','west','south','united']
souths = [idx for idx, val in enumerate(List) if val == 'south']
for i, idx in enumerate(souths):
    List.insert(idx+i, 'canada')

9
你称这个产品为“高性能”,是基于何种依据?你进行过定时测试,还是仅凭感觉认为它是高性能的? - dwanderson
@dwanderson,你不需要进行测试就可以知道计算复杂度大约是O(1.25n)。 - Steven Moseley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接