2015-12-07 67 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

相關問題