2011-06-23 18 views
2

項目我想找到那些在list1項目:發現列表1,同時也是在列表2項,並刪除不列表1

list1 = ['peach', 'plum', 'apple', 'kiwi', 'grape'] 

這也是list2

list2 = ['peach,0,1,1,0,1,0,1', 'carrot,1,0,1,1,0,1,1', 'lime,0,1,1,0,1,1,0', 'apple,0,1,1,0,1,1,1'] 

問題是list2中的項目在需要的項目後面有數字。我如何找到既list1list2的共同項目,並刪除list2項目不在list1

回答

9
# using a set makes the later `x in keep` test faster 
keep = set(['peach', 'plum', 'apple', 'kiwi', 'grape']) 

list2= ['peach,0,1,1,0,1,0,1', 'carrot,1,0,1,1,0,1,1', 
     'lime,0,1,1,0,1,1,0', 'apple,0,1,1,0,1,1,1'] 

# x.split(',',1)[0] = the part before the first `,` 
new = [x for x in list2 if x.split(',',1)[0] in keep] 
+0

哈!花了5分鐘打出一個基本上等於你的答案。我相信你的出衆打字速度:) –

0

僞代碼(同時仍保持零和一的重疊性損益後):

for each i in list1 
    foreach j in list2 
     if j.contains(i) 
      list2.remove(j) 

將j和i作爲字符串對待,並查看每個元素是否包含list1中的元素。

+1

這是一個壞主意,修改列表2 WHI le你正在迭代它 –

0

塞德里克的答案(這已被刪除,但是是一個很好的啓示,這要歸功於他)錯過,你有一個字符串包括點所有的0和1。要完成:

for item in list1: 
    try: 
     list2.remove(item.split(',')[0]) 
    except ValueError: 
     pass 

最大

+0

你說得對,我回答的有點太快;) –

+0

這會刪除list1中的* *列表1中的項目,OP想要刪除那些*列表1中不是*的項目。 –

+0

@Jochen Ritzel:該死的,你說得對,對不起太快回答。感謝您的正確答案。 – JMax

0

像這樣的東西可以幫助(注意,它會創建新的列表對象):

list1= ['peach', 'plum', 'apple', 'kiwi', 'grape'] 
list2= ['peach,0,1,1,0,1,0,1', 'carrot,1,0,1,1,0,1,1', 'lime,0,1,1,0,1,1,0', 'apple,0,1,1,0,1,1,1'] 
list2 = [x for x in list2 for y in list1 if x.split(',')[0]==y] 
+1

如果列表2中有葡萄柚或菠蘿,這將無法正常工作 –

+0

是的,但你是對的。固定 –

相關問題