2016-01-13 22 views
5

W Pythonie można uzyskać elementy, które są wyłącznie do lst1 używając:Co to jest odpowiednik Matlaba dla "nie w" Pythona?

lst1=['a','b','c'] 
lst2=['c','d','e'] 
lst3=[] 
for i in lst1: 
    if i not in lst2: 
     lst3.append(i) 

Jaki byłby równoważny Matlab?

+1

także: 'set (lst1) - zestaw (lst2)' – gauteh

+0

@gauteh Dopóki nie dbają o liczbie powtórzeń każdego elementu. np. 'set()' nie działałoby poprawnie, jeśli 'lst1 = ['a', 'a', 'b', 'c']'. – dwanderson

Odpowiedz

13

Szukasz MATLAB na setdiff -

setdiff(lst1,lst2) 

run Sample -

>> lst1={'a','b','c'}; 
>> lst2={'c','d','e'}; 
>> setdiff(lst1,lst2) 
ans = 
    'a' 'b' 

Sprawdź z Pythona run -

In [161]: lst1=['a','b','c'] 
    ...: lst2=['c','d','e'] 
    ...: lst3=[] 
    ...: for i in lst1: 
    ...:  if i not in lst2: 
    ...:   lst3.append(i) 
    ...:   

In [162]: lst3 
Out[162]: ['a', 'b'] 

w rzeczywistości masz setdiff w Pythona NumPy module jako cóż, jako numpy.setdiff1d. Równowartość realizacja z nim będzie -

In [166]: import numpy as np 

In [167]: np.setdiff1d(lst1,lst2) # Output as an array 
Out[167]: 
array(['a', 'b'], 
     dtype='|S1') 

In [168]: np.setdiff1d(lst1,lst2).tolist() # Output as list 
Out[168]: ['a', 'b'] 
+0

Perfect, Thanks – CiaranWelsh

+0

'setdiff' programu MATLAB przesuwa się tak, jakby wejścia były prawdziwymi zestawami algebraicznymi, tzn. Żaden element nie jest powtarzany. (jeśli jest powtórzony, to jest ignorowane przy obliczaniu różnic) skończyło mi się pisanie funkcji "R" "vecdiff", aby obsłużyć różnice w kolekcjach elementów, w których niektóre wartości są powtarzane; może to być konieczne w programie MATLAB, w zależności od rzeczywistych potrzeb PO. –

+0

@CarlWitthoft Tak, MATLAB zachowałby tylko unikalne elementy na wyjściu. Aby zachować duplikaty, można użyć ['ismember'] (http://www.mathworks.com/help/matlab/ref/ismember.html) -' lst1 (~ ismember (lst1, lst2)) '. Więc 'R 'natywnie nie ma czegoś podobnego do' setdiff'? – Divakar

Powiązane problemy