2017-08-10 35 views
0

有沒有簡單的方法來使用map函數對以下示例進行編碼?如果不是,使用列表理解怎麼辦?如果條件並附加到列表的地圖

lst1=['a','b','c'] 
lst2=['a','b','c','d'] 

l=[] 
for iteml1 in lst1: 
     if iteml1 in lst2: 
      l.append((lst2.index(iteml1),iteml1)) 

l是一個向量,它包含lst2列表和lst2元素中的lst1元素的索引。輸出:

l 
Out[1]: [(0,'a'),(1,'b'),(2,'c')] 
+0

它已經固定),日Thnx對於校正。 – PeCaDe

+1

挑戰是通過使用地圖來解決,列表理解在這個論壇中得到了廣泛的解決,以負面的方式對問題進行評分是沒有意義的... – PeCaDe

+0

使用'map'和LC只會使問題聽起來像一個編碼挑戰而不是實際問題。相反,你應該問什麼是一些更好的方式來做到這一點在時間,可讀性,最佳實踐等 –

回答

2

根據您的列表的大小,您可能要建立一個字典映射項lst1將其索引到避免重複Ø(N)list.index查找和Ø(n)的成員爲每個項目檢查:

dct = dict((k, v) for v, k in enumerate(lst1)) 
l = [(dct[x], x) for x in lst1 if x in dct] 
print(l) 
# [(0, 'a'), (1, 'b'), (2, 'c')] 

成員資格檢查和__getitem__對於字典都是在同一時間完成的。

2
l = [(lst2.index(item), item) for item in lst1 if item in lst2] 
2

您可以從lst2其項目映射到其索引創建字典,然後用它來獲得預期的輸出。這將是O(N)

>>> indices = {x: i for i, x in enumerate(lst2)}  
>>> [(indices[item], item) for item in lst1 if item in indices] 
[(0, 'a'), (1, 'b'), (2, 'c')] 

另一種選擇將是獲取包含兩個列表的交集,然後循環一組過lst2並在該組做一個查詢:

>>> s = set(lst2).intersection(lst1)  
>>> [(i, x) for i, x in enumerate(lst2) if x in s] 
[(0, 'a'), (1, 'b'), (2, 'c')] 
2

使用地圖:

dict(map(lambda x: (lst2.index(x), x), lst1)) 

輸出

{0: 'a', 1: 'b', 2: 'c'} 

用於字典的輸出列表:

result.items()