2015-12-07 68 views
3

是否可以在出现特定字符串时插入到列表中。 例子:在字符串列表中的特定元素之前和之后插入元素

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

所以对于每一次的字符串“南方”提出的名单将元素前南在列表中插入项目'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'] 
+0

您正在寻找'insert',而不是'append'。 [这个问题](http://stackoverflow.com/questions/34099329/add-spaces-to-elements-of-list/34099402?noredirect=1#comment55950963_34099402)可能会有所帮助,但您必须将条件语句您的列表遍历 –

+0

您确定它是'<\usa>'而不是''? –

回答

2

答案很简单:

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 
+3

不需要'else';你在任何一个分支中追加'each',所以使它成为无条件的。 –

2

为了能够在特定位置的列表中放置元素,你需要列出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') 
+0

这并不能真正回答我认为的问题吗? –

+0

我了解插入功能,但是如何在每个说'南'的元素之前向我的列表中插入一个新元素 – loneWolf

0

可以使用双列表理解使用一个简单的一行(使用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'] 

答案由两部分组成:

  • 内部列表理解:[(['canada',x] if x == 'south' else [x]) for x in List]这遍历列表并返回列表的列表。如果x为南,则发出['canada','south'],否则发出[x]。所以结果如下:

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

    给定的列表。

  • 接下来使用this approach展平结果。

1

这是一个高性能的列表理解方法。

首先,它生成一个包含“南”的索引列表。

然后,它使用的指数+指标,以便将插入点(以帐户为在循环前面插入),制作了一个简单,快捷,易于遵循这一问题Python的解决方案:

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') 
+2

是什么让你称之为高性能?你是否做过时间测试,或者你认为它是高性能的? – dwanderson

2

使用一个简单的循环:

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调用会让大列表真的很慢,因为它需要为每个插入构建整个列表。

+0

我没有详细说明,但我明白这一点,我看它是否包含这些字母。然后我会追加,因为在我的实际列表中会有追加到搜索元素的数字。 – loneWolf

相关问题