2017-06-02 153 views
2

的最接近的值,我有兩個名單分別是:查找列表元素

>>> list1 = ['gain','archive','win','success'] 
>>> list2 = ['i','win','game','i','am','success','cool'] 

,也是我通過對比發現名單列表兩者的相同的值。

>>> result= set(list1) & set(list2) 

輸出是

set(['win', 'success']) 

現在我想找到result下一個元素值。這裏是:'game''cool'

我該怎麼做(使用python 2.7)?

回答

2

你可以做兩兩遍歷所有你list2,並做了 「交集」 手動:

list1 = ['gain','archive','win','success'] 
list2 = ['i','win','game','i','am','success','cool'] 

set1 = set(list1) 

result = [] 
for item, nextitem in zip(list2, list2[1:]): # pairwise iteration 
    if item in set1: 
     result.append(nextitem) # append the next item if the current item is in the intersection 

print(result) # ['game', 'cool'] 
7

既然你有交集的話

result = { 'win', 'success' } 

你可以找到下一個單詞list2這樣的:

next_words = [list2[list2.index(word)+1] for word in result] 

index讓你列表中的給定元素的索引。你可以加1來得到下一個元素。

如果您的元素位於列表的末尾,它將拋出異常,因爲沒有「next」元素可以獲取。

+0

尼斯,如何避免在沒有「下一個」元素時拋出異常。 –

+1

取決於你想在這種情況下發生的事情。你沒有指定。 – khelwood

3

可以使用index功能,並添加1。不過要小心,如果你的共同點是列表的最後一個,它會產生一個錯誤

list1 = ['gain','archive','win','success'] 
list2 = ['i','win','game','i','am','success','cool'] 
result= set(list1) & set(list2) 

list3 = [list2[list2.index(e)+1] for e in result] 

編輯對於情況下,你最後一個元素是一種常見的元素:

result= set(list1) & set(list2) 
list4 = [] 
for e in result: 
    try: 
     list4.append(list2[list2.index(e)+1]) 
    except: 
     pass 

輸出:['game', 'cool']

1

你可以ü se list2.index,但這只是爲了找回索引而進行全面搜索,並且人爲地將複雜性從O(n)增加到O(n*n)

只記錄每個單詞的索引。有幾種方法可以做到這一點。

  • 創建自己的函數,搜索常用詞,並返回它們的這些話在list2索引。這可能是pythonic最少但最快的。

  • list2的單詞中創建一個字典到它們的索引,然後在計算完集合的交集之後,查找該字典以查找索引並將其加1。你需要建立一個完整的字典大小爲list2,這可能是昂貴的(但仍然比O(n*n)好)。

  • 創建從list2的單詞到他們的下一個單詞的字典或None如果沒有並且查找字典來查找索引。你需要建立一個完整的字典大小list2,這可能是昂貴的。

  • 如果你知道如何使用itertools,你可以做一個迭代器上list2是產生指數和字,如果字是list1篩選結果,那麼只有挑選指標。

2

該做的伎倆在list2中的下一個元素:

next_result = [list2[list2.index(el)+1] for el in result if list2.index(el)+1<len(list2)]