Sprawdź, czy pozycja listy Pythona zawiera ciąg wewnątrz innego ciągu


Mam listę:
my_list = ['abc-123', 'def-456', 'ghi-789', 'abc-456']

i chcesz wyszukać elementy zawierające ciąg
„abc”
. Jak mogę to zrobić?
if 'abc' in my_list:

sprawdzi, czy
„abc”
istnieje na liście, ale jest częścią
„abc-123”
i
„abc-456”
, < code> „abc” nie istnieje samodzielnie. Jak więc mogę uzyskać wszystkie elementy zawierające
„abc”
?
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Jeśli chcesz tylko sprawdzić obecność
abc
w dowolnym wierszu listy, możesz spróbować
some_list = ['abc-123', 'def-456', 'ghi-789', 'abc-456']
if any("abc" in s for s in some_list):
# whatever

Jeśli naprawdę chcesz uzyskać wszystkie elementy zawierające
abc
, użyj
matching = [s for s in some_list if "abc" in s]
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Po prostu wyrzuć to: jeśli chcesz dopasować więcej niż jeden ciąg, na przykład
abc
i
def
, możesz połączyć dwa wyrażenia listowe w następujący sposób:
matchers = ['abc','def']
matching = [s for s in my_list if any(xs in s for xs in matchers)]

Wynik:
['abc-123', 'def-456', 'abc-456']
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Użyj
filtra
, aby dostać się do elementów, które mają
abc
.
>>> lst = ['abc-123', 'def-456', 'ghi-789', 'abc-456']
>>> print filter(lambda x: 'abc' in x, lst)
['abc-123', 'abc-456']

Możesz także użyć rozumienia listy.
>>> [x for x in lst if 'abc' in x]

Nawiasem mówiąc, nie używaj słowa
list
jako nazwy zmiennej, ponieważ jest już używane dla typu
list
.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

To jest najkrótsza ścieżka:
if 'abc' in str(my_list):
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

To dość stare pytanie, ale oferuję tę odpowiedź, ponieważ poprzednie odpowiedzi nie dotyczą pozycji na liście, które nie są łańcuchami (lub jakimś rodzajem iterowalnego obiektu). Takie elementy spowodowałyby niepowodzenie zrozumienia całej listy z wyjątkiem.
Aby wdzięcznie obsłużyć takie elementy na liście, pomijając elementy nie iterowalne, użyj następujących poleceń:
[el for el in lst if isinstance(el, collections.Iterable) and (st in el)]

następnie z taką listą:
lst = [None, 'abc-123', 'def-456', 'ghi-789', 'abc-456', 123]
st = 'abc'

nadal będziesz otrzymywać pasujące elementy (
['abc-123', 'abc-456']
)
Test iterowalności może nie być najlepszy. Mam to stąd:

w Pythonie, jak mogę stwierdzić, czy obiekt jest iteracyjny?
https://coderoad.ru/1952464/
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

x = 'aaa'
L = ['aaa-12', 'bbbaaa', 'cccaa']
res = [y for y in L if x in y]
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

for item in my_list:
if item.find("abc") != -1:
print item
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

any('abc' in item for item in mylist)
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Użyj metody
__contains __ ()
ciągu.
a = ['abc-123', 'def-456', 'ghi-789', 'abc-456']
for i in a:
if i.__contains__("abc") :
print(i, " is containing")
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Jestem nowy w Pythonie. Poniższy kod działa i jest łatwy do zrozumienia
my_list = ['abc-123', 'def-456', 'ghi-789', 'abc-456']
for str in my_list:
if 'abc' in str:
print(str)
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

mylist=['abc','def','ghi','abc']pattern=re.compile(r'abc') pattern.findall(mylist)
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

my_list = ['abc-123', 'def-456', 'ghi-789', 'abc-456']for item in my_list:
if (item.find('abc')) != -1:
print ('Found at ', item)
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Przeprowadziłem wyszukiwanie, które wymaga wpisania określonej wartości, a następnie wyszuka wartość z listy zawierającej dane wejściowe:
my_list = ['abc-123',
'def-456',
'ghi-789',
'abc-456'
]imp = raw_input('Search item: ')for items in my_list:
val = items
if any(imp in val for items in my_list):
print(items)

Spróbuj wyszukać „abc”.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

def find_dog(new_ls):
splt = new_ls.split()
if 'dog' in splt:
print("True")
else:
print('False')
find_dog("Is there a dog here?")
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

potrzebowałem

lista indeksowa

które pasują do takiego dopasowania:
lst=['abc-123', 'def-456', 'ghi-789', 'abc-456'][n for n, x in enumerate(lst) if 'abc' in x]


wynik

[0, 3]
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Jeśli chcesz uzyskać listę danych dla wielu podciągów
możesz to zmienić w ten sposób
some_list = ['abc-123', 'def-456', 'ghi-789', 'abc-456']
# select element where "abc" or "ghi" is included
find_1 = "abc"
find_2 = "ghi"
result = [element for element in some_list if find_1 in element or find_2 in element]
# Output ['abc-123', 'ghi-789', 'abc-456']
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Pytanie: podaj informacje o abc
a = ['abc-123', 'def-456', 'ghi-789', 'abc-456']
aa = [ string for string in a if "abc" in string]
print(aa)Output => ['abc-123', 'abc-456']
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

O ile wiem, wyrażenie „za” zawsze zajmie trochę czasu.
Wraz ze wzrostem długości listy wydłuża się również czas wykonania.
Myślę, że wyszukiwanie podciągu w ciągu z operatorem „is” jest nieco szybsze.
In [1]: t = ["abc_%s" % number for number in range(10000)]In [2]: %timeit any("9999" in string for string in t)
1000 loops, best of 3: 420 µs per loopIn [3]: %timeit "9999" in ",".join(t)
10000 loops, best of 3: 103 µs per loop

Ale zgadzam się, że instrukcja
any
jest bardziej czytelna.

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się