2013-05-05 24 views
22

Znalazłem kilka odpowiedzi na to pytanie wcześniej, ale wydają się one być przestarzałe dla obecnych wersji Pythona (a przynajmniej nie działają dla mnie).Sprawdź, czy podciągi znajdują się na liście ciągów znaków?

Chcę sprawdzić, czy podciąg jest zawarty na liście ciągów. Potrzebuję tylko wyniku boolowskiego.

Znalazłem rozwiązanie:

word_to_check = 'or' 
wordlist = ['yellow','orange','red'] 

result = any(word_to_check in word for word in worldlist) 

z tego kodu byłoby oczekiwać, aby uzyskać wartość True. Jeśli słowo było "der", to wyjście powinno być False.

Jednak wynikiem jest funkcja generatora i nie mogę znaleźć sposobu na uzyskanie wartości True.

Każdy pomysł?

+3

kod pisał działa dobrze (z wyjątkiem 'listy słów'/'listy światowej '). Zgaduję, że zapomniałeś wywołania 'any()', gdy próbowałeś go wcześniej. –

+0

Tęskniłem za tym, że użyłeś już 'any'. –

+0

Biorąc pod uwagę twój kod i komentarze, myślę, że problemem jest "dowolna" funkcja, której używam. Prawdopodobnie jest to dowolna funkcja w module numpy. Więc rozwiązaniem byłoby użycie wbudowanej funkcji, ale jakikolwiek pomysł, jak to zrobić po zaimportowaniu modułu numpy? –

Odpowiedz

20

Można importować any z __builtin__ w przypadku, gdy został zastąpiony przez innego any:

>>> from __builtin__ import any as b_any 
>>> lst = ['yellow', 'orange', 'red'] 
>>> word = "or" 
>>> b_any(word in x for x in lst) 
True 

Należy zauważyć, że w Pythonie 3 __builtin__ została zmieniona na builtins.

+2

Możesz obejść ten problem za pomocą 'numpy.any', jeśli zamiast generatora zostanie użyty kompilator listy:' np.any ([word in x for x in lis]) '. –

+1

@MarkTolonen 'np.any' będzie powolny, ponieważ najpierw generuje całą listę. –

+0

Stosunkowo wolniej tak, zauważalnie wolniej ... tylko OP może powiedzieć, ale nie dla swojego przykładu :) –

4

Można użyć next zamiast:

colors = ['yellow', 'orange', 'red'] 
search = "or" 

result = next((True for color in colors if search in color), False) 

print(result) # True 

Aby wyświetlić ciąg znaków, który zawiera podciąg:

colors = ['yellow', 'orange', 'red'] 
search = "or" 

result = [color for color in colors if search in color] 

print(result) # Orange 
+1

To wygląda na świetny sposób na znalezienie obiektów z podciąganiem i może być użyte również do sprawdzania obiektywu True/False długość wynikowej tablicy. –

18

Kod zostanie zaksięgowana użyciu dowolny() jest poprawne i powinno działać, jeśli gdzieś ją na nowo zdefiniowałem.

Powiedział, że nie jest to proste i szybkie rozwiązanie, które można uzyskać za pomocą szukanie podciągu na jednym połączeniu ciąg:

>>> wordlist = ['yellow','orange','red'] 
>>> combined = '\t'.join(wordlist) 

>>> 'or' in combined 
True 
>>> 'der' in combined 
False 

To powinno działać znacznie szybciej niż podejście z wykorzystaniem żadnego. Znakiem łączenia może być dowolny znak, który nie występuje w jednym ze słów na liście słów.

+2

+1 dla najbardziej czytelnego rozwiązania, moim zdaniem – starbeamrainbowlabs

+1

Jest to zdecydowanie najbardziej przydatne i proste rozwiązanie, moim zdaniem. Można go również skrócić do jednej linii: ''lub' in '\ t'.join (lista słów)' – mjp

0

Także jeśli ktoś chce sprawdzić, czy któryś z wartościami słownika istnieje jako podciąg w liście ciągów, można użyć tego:

list_a = [ 
    'Copy of snap-009ecf9feb43d902b from us-west-2', 
    'Copy of snap-0fe999422014504b6 from us-west-2', 
    'Copy of snap-0fe999422014cscx504b6 from us-west-2', 
    'Copy of snap-0fe999422sdad014504b6 from us-west-2' 
] 
dict_b = { 
    '/dev/xvda': 'snap-0fe999422014504b6', 
    '/dev/xvdsdsa': 'snap-sdvcsdvsdvs' 
} 

for b1 in dict_b.itervalues(): 
    result = next(("found" for a1 in a if b1 in a1), "not found") 
    print result 

Drukuje

not found 
found 
Powiązane problemy