How do I search for items that contain the string 'abc'
in the following list?
xs = ['abc-123', 'def-456', 'ghi-789', 'abc-456']
The following checks if 'abc'
is in the list, but does not detect 'abc-123'
and 'abc-456'
:
if 'abc' in xs:
asked Jan 30, 2011 at 13:29
3
To check for the presence of 'abc'
in any string in the list:
xs = ['abc-123', 'def-456', 'ghi-789', 'abc-456']
if any("abc" in s for s in xs):
...
To get all the items containing 'abc'
:
matching = [s for s in xs if "abc" in s]
Mateen Ulhaq
23.7k17 gold badges94 silver badges132 bronze badges
answered Jan 30, 2011 at 13:32
Sven MarnachSven Marnach
566k117 gold badges932 silver badges832 bronze badges
19
Just throwing this out there: if you happen to need to match against more than one string, for example abc
and def
, you can combine two comprehensions as follows:
matchers = ['abc','def']
matching = [s for s in my_list if any(xs in s for xs in matchers)]
Output:
['abc-123', 'def-456', 'abc-456']
answered Aug 3, 2014 at 6:00
fantabolousfantabolous
21.1k7 gold badges54 silver badges49 bronze badges
4
Use filter
to get all the elements that have 'abc'
:
>>> xs = ['abc-123', 'def-456', 'ghi-789', 'abc-456']
>>> list(filter(lambda x: 'abc' in x, xs))
['abc-123', 'abc-456']
One can also use a list comprehension:
>>> [x for x in xs if 'abc' in x]
Mateen Ulhaq
23.7k17 gold badges94 silver badges132 bronze badges
answered Jan 30, 2011 at 13:34
MAKMAK
26k11 gold badges54 silver badges85 bronze badges
If you just need to know if ‘abc’ is in one of the items, this is the shortest way:
if 'abc' in str(my_list):
Note: this assumes ‘abc’ is an alphanumeric text. Do not use it if ‘abc’ could be just a special character (i.e. []’, ).
answered Apr 13, 2016 at 8:19
RogerSRogerS
1,3029 silver badges11 bronze badges
12
This is quite an old question, but I offer this answer because the previous answers do not cope with items in the list that are not strings (or some kind of iterable object). Such items would cause the entire list comprehension to fail with an exception.
To gracefully deal with such items in the list by skipping the non-iterable items, use the following:
[el for el in lst if isinstance(el, collections.Iterable) and (st in el)]
then, with such a list:
lst = [None, 'abc-123', 'def-456', 'ghi-789', 'abc-456', 123]
st = 'abc'
you will still get the matching items (['abc-123', 'abc-456']
)
The test for iterable may not be the best. Got it from here: In Python, how do I determine if an object is iterable?
answered Oct 20, 2011 at 13:24
Robert MuilRobert Muil
2,9281 gold badge24 silver badges30 bronze badges
4
x = 'aaa'
L = ['aaa-12', 'bbbaaa', 'cccaa']
res = [y for y in L if x in y]
jamylak
128k30 gold badges230 silver badges230 bronze badges
answered Jan 30, 2011 at 13:31
MariyMariy
5,6564 gold badges40 silver badges57 bronze badges
0
for item in my_list:
if item.find("abc") != -1:
print item
jamylak
128k30 gold badges230 silver badges230 bronze badges
answered Jan 30, 2011 at 13:38
RubyconRubycon
18.1k10 gold badges49 silver badges70 bronze badges
1
any('abc' in item for item in mylist)
answered Jan 30, 2011 at 13:34
ImranImran
86.1k23 gold badges97 silver badges131 bronze badges
I am new to Python. I got the code below working and made it easy to understand:
my_list = ['abc-123', 'def-456', 'ghi-789', 'abc-456']
for item in my_list:
if 'abc' in item:
print(item)
answered Apr 7, 2018 at 7:52
Amol ManthalkarAmol Manthalkar
1,8501 gold badge16 silver badges16 bronze badges
0
Use the __contains__()
method of Pythons string class.:
a = ['abc-123', 'def-456', 'ghi-789', 'abc-456']
for i in a:
if i.__contains__("abc") :
print(i, " is containing")
kalehmann
4,7316 gold badges24 silver badges36 bronze badges
answered Feb 8, 2019 at 16:37
Harsh LodhiHarsh Lodhi
1494 silver badges10 bronze badges
I needed the list indices that correspond to a match as follows:
lst=['abc-123', 'def-456', 'ghi-789', 'abc-456']
[n for n, x in enumerate(lst) if 'abc' in x]
output
[0, 3]
answered Jan 5, 2020 at 19:02
Grant ShannonGrant Shannon
4,5901 gold badge45 silver badges36 bronze badges
If you want to get list of data for multiple substrings
you can change it this way
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']
answered Jul 14, 2020 at 2:43
mylist=['abc','def','ghi','abc']
pattern=re.compile(r'abc')
pattern.findall(mylist)
Bugs
4,4919 gold badges31 silver badges41 bronze badges
answered Jul 4, 2018 at 13:32
3
Adding nan to list, and the below works for me:
some_list = ['abc-123', 'def-456', 'ghi-789', 'abc-456',np.nan]
any([i for i in [x for x in some_list if str(x) != 'nan'] if "abc" in i])
answered Feb 18, 2021 at 2:38
Sam S.Sam S.
5976 silver badges22 bronze badges
my_list = ['abc-123', 'def-456', 'ghi-789', 'abc-456']
for item in my_list:
if (item.find('abc')) != -1:
print ('Found at ', item)
answered Mar 16, 2018 at 9:14
I did a search, which requires you to input a certain value, then it will look for a value from the list which contains your input:
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)
Try searching for ‘abc’.
answered Jan 26, 2019 at 2:44
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?")
4b0
21.7k30 gold badges94 silver badges141 bronze badges
answered Jul 18, 2019 at 8:22
Question : Give the informations of 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']
cottontail
7,79218 gold badges37 silver badges47 bronze badges
answered Jun 16, 2018 at 10:52
Soudipta DuttaSoudipta Dutta
1,3051 gold badge12 silver badges7 bronze badges
All the answers work but they always traverse the whole list. If I understand your question, you only need the first match. So you don’t have to consider the rest of the list if you found your first match:
mylist = ['abc123', 'def456', 'ghi789']
sub = 'abc'
next((s for s in mylist if sub in s), None) # returns 'abc123'
If the match is at the end of the list or for very small lists, it doesn’t make a difference, but consider this example:
import timeit
mylist = ['abc123'] + ['xyz123']*1000
sub = 'abc'
timeit.timeit('[s for s in mylist if sub in s]', setup='from __main__ import mylist, sub', number=100000)
# for me 7.949463844299316 with Python 2.7, 8.568840944994008 with Python 3.4
timeit.timeit('next((s for s in mylist if sub in s), None)', setup='from __main__ import mylist, sub', number=100000)
# for me 0.12696599960327148 with Python 2.7, 0.09955992100003641 with Python 3.4
Мы можем использовать оператор in в Python, чтобы проверить, присутствует ли строка в списке или нет. Также есть оператор not in, чтобы проверить, отсутствует ли строка в списке.
l1 = ['A', 'B', 'C', 'D', 'A', 'A', 'C'] # string in the list if 'A' in l1: print('A is present in the list') # string not in the list if 'X' not in l1: print('X is not present in the list')
Вывод:
A is present in the list X is not present in the list
Давайте посмотрим на другой пример, где мы попросим пользователя ввести строку для проверки в списке.
l1 = ['A', 'B', 'C', 'D', 'A', 'A', 'C'] s = input('Please enter a character A-Z:n') if s in l1: print(f'{s} is present in the list') else: print(f'{s} is not present in the list')
Вывод:
Please enter a character A-Z: A A is present in the list
Как найти строку в списке с помощью count()
Мы также можем использовать функцию count(), чтобы получить количество появлений строки в списке. Если его вывод равен 0, это означает, что строки нет в списке.
l1 = ['A', 'B', 'C', 'D', 'A', 'A', 'C'] s = 'A' count = l1.count(s) if count > 0: print(f'{s} is present in the list for {count} times.')
Поиск всех индексов строки в списке
Нет встроенной функции для получения списка всех индексов строки в списке. Вот простая программа для получения списка всех индексов, в которых строка присутствует в списке.
l1 = ['A', 'B', 'C', 'D', 'A', 'A', 'C'] s = 'A' matched_indexes = [] i = 0 length = len(l1) while i < length: if s == l1[i]: matched_indexes.append(i) i += 1 print(f'{s} is present in {l1} at indexes {matched_indexes}')
( 2 оценки, среднее 5 из 5 )
Помогаю в изучении Питона на примерах. Автор практических задач с детальным разбором их решений.
Получение индекса для строк: str.index (), str.rindex() и str.find(), str.rfind()
String
также имеет index
метод , но и более продвинутые варианты и дополнительное str.find
.Для обоих из них есть дополнительный обратный метод.
astring = 'Hello on StackOverflow'
astring.index('o') # 4
astring.rindex('o') # 20
astring.find('o') # 4
astring.rfind('o') # 20
Разница между index
/ rindex
и find
/ rfind
это то , что происходит , если подстрока не найдена в строке:
astring.index('q') # ValueError: substring not found
astring.find('q') # -1
Все эти методы позволяют начальный и конечный индексы:
astring.index('o', 5) # 6
astring.index('o', 6) # 6 - start is inclusive
astring.index('o', 5, 7) # 6
astring.index('o', 5, 6) # - end is not inclusive
ValueError: подстрока не найдена
astring.rindex('o', 20) # 20
astring.rindex('o', 19) # 20 - still from left to right
astring.rindex('o', 4, 7) # 6
В поисках элемента
Все встроенные в коллекции в Python реализовать способ проверить членство элемента с использованием in
. Список
alist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
5 in alist # True
10 in alist # False
Кортеж
atuple =('0', '1', '2', '3', '4')
4 in atuple # False
'4' in atuple # True
строка
astring = 'i am a string'
'a' in astring # True
'am' in astring # True
'I' in astring # False
Задавать
aset = {(10, 10), (20, 20), (30, 30)}
(10, 10) in aset # True
10 in aset # False
Dict
dict
немного особенный: нормальный in
проверяет только ключи. Если вы хотите , чтобы искать в значении , которые необходимо указать. То же самое , если вы хотите найти пар ключ-значение.
adict = {0: 'a', 1: 'b', 2: 'c', 3: 'd'}
1 in adict # True - implicitly searches in keys
'a' in adict # False
2 in adict.keys() # True - explicitly searches in keys
'a' in adict.values() # True - explicitly searches in values
(0, 'a') in adict.items() # True - explicitly searches key/value pairs
Получение списка индексов и кортежей: list.index(), tuple.index()
list
и tuple
имеют index
-метода получить позицию элемента:
alist = [10, 16, 26, 5, 2, 19, 105, 26]
# search for 16 in the list
alist.index(16) # 1
alist[1] # 16
alist.index(15)
Ошибка значения: 15 отсутствует в списке
Но возвращает только позицию первого найденного элемента:
atuple = (10, 16, 26, 5, 2, 19, 105, 26)
atuple.index(26) # 2
atuple[2] # 26
atuple[7] # 26 - is also 26!
Поиск ключа(ей) по значению в dict
dict
не имеет встроенный метода для поиска значения или ключа , потому что словари являются упорядоченными. Вы можете создать функцию, которая получает ключ (или ключи) для указанного значения:
def getKeysForValue(dictionary, value):
foundkeys = []
for keys in dictionary:
if dictionary[key] == value:
foundkeys.append(key)
return foundkeys
Это также может быть записано как эквивалентное понимание списка:
def getKeysForValueComp(dictionary, value):
return [key for key in dictionary if dictionary[key] == value]
Если вам нужен только один найденный ключ:
def getOneKeyForValue(dictionary, value):
return next(key for key in dictionary if dictionary[key] == value)
Первые две функции возвращает list
всех keys
, которые имеют определенное значение:
adict = {'a': 10, 'b': 20, 'c': 10}
getKeysForValue(adict, 10) # ['c', 'a'] - order is random could as well be ['a', 'c']
getKeysForValueComp(adict, 10) # ['c', 'a'] - dito
getKeysForValueComp(adict, 20) # ['b']
getKeysForValueComp(adict, 25) # []
Другой вернет только один ключ:
getOneKeyForValue(adict, 10) # 'c' - depending on the circumstances this could also be 'a'
getOneKeyForValue(adict, 20) # 'b'
и поднять StopIteration
– Exception
, если значение не в dict
:
getOneKeyForValue(adict, 25)
StopIteration
Получение индекса для отсортированных последовательностей: bisect.bisect_left()
Отсортированные последовательности позволяют использовать более быстрый поиск алгоритмов: bisect.bisect_left()
[1]:
import bisect
def index_sorted(sorted_seq, value):
"""Locate the leftmost value exactly equal to x or raise a ValueError"""
i = bisect.bisect_left(sorted_seq, value)
if i != len(sorted_seq) and sorted_seq[i] == value:
return i
raise ValueError
alist = [i for i in range(1, 100000, 3)] # Sorted list from 1 to 100000 with step 3
index_sorted(alist, 97285) # 32428
index_sorted(alist, 4) # 1
index_sorted(alist, 97286)
ValueError
Для очень больших отсортированных последовательностей выигрыш в скорости может быть достаточно высоким. В случае первого поиска примерно в 500 раз быстрее:
%timeit index_sorted(alist, 97285)
# 100000 loops, best of 3: 3 µs per loop
%timeit alist.index(97285)
# 1000 loops, best of 3: 1.58 ms per loop
Хотя это немного медленнее, если элемент является одним из самых первых:
%timeit index_sorted(alist, 4)
# 100000 loops, best of 3: 2.98 µs per loop
%timeit alist.index(4)
# 1000000 loops, best of 3: 580 ns per loop
Поиск вложенных последовательностей
Поиск во вложенных последовательностях , как в list
из tuple
требует такого подхода , как поиск ключей для значений в dict
, но нуждается в пользовательских функциях.
Индекс самой внешней последовательности, если значение было найдено в последовательности:
def outer_index(nested_sequence, value):
return next(index for index, inner in enumerate(nested_sequence)
for item in inner
if item == value)
alist_of_tuples = [(4, 5, 6), (3, 1, 'a'), (7, 0, 4.3)]
outer_index(alist_of_tuples, 'a') # 1
outer_index(alist_of_tuples, 4.3) # 2
или индекс внешней и внутренней последовательности:
def outer_inner_index(nested_sequence, value):
return next((oindex, iindex) for oindex, inner in enumerate(nested_sequence)
for iindex, item in enumerate(inner)
if item == value)
outer_inner_index(alist_of_tuples, 'a') # (1, 2)
alist_of_tuples[1][2] # 'a'
outer_inner_index(alist_of_tuples, 7) # (2, 0)
alist_of_tuples[2][0] # 7
В общем случае (не всегда) с помощью next
и выражения генератора с условиями , чтобы найти первое вхождение искомого значения является наиболее эффективным подходом.
Поиск в пользовательских классах: __contains__ и __iter__
Для того, чтобы разрешить использование in
пользовательских классах класса должен либо предоставить магический метод __contains__
или, если это невозможно, в __iter__
-метод.
Предположим , у вас есть класс , содержащий list
из list
s:
class ListList:
def __init__(self, value):
self.value = value
# Create a set of all values for fast access
self.setofvalues = set(item for sublist in self.value for item in sublist)
def __iter__(self):
print('Using __iter__.')
# A generator over all sublist elements
return (item for sublist in self.value for item in sublist)
def __contains__(self, value):
print('Using __contains__.')
# Just lookup if the value is in the set
return value in self.setofvalues
# Even without the set you could use the iter method for the contains-check:
# return any(item == value for item in iter(self))
Использование тестирования членства возможно при использовании in
:
a = ListList([[1,1,1],[0,1,1],[1,5,1]])
10 in a # False
# Prints: Using __contains__.
5 in a # True
# Prints: Using __contains__.
даже после удаления __contains__
метода:
del ListList.__contains__
5 in a # True
# Prints: Using __iter__.
Примечание: зацикливание in
(как for i in a
) всегда будет использовать __iter__
даже если класс реализует __contains__
метод.
29.12.2019Python, Программы Python
Классическая проблема, которая может быть легко решена с помощью Python, а также много раз решалась, заключается в том, чтобы найти, является ли строка подстрокой другого. Но иногда, кто-то хочет расширить это в списке строк, и, следовательно, затем необходимо пройти весь контейнер и выполнить общий алгоритм.
Давайте обсудим некоторые способы поиска строк с заданной подстрокой в списке.
Метод № 1: Использование понимания списка
Понимание списков — это элегантный способ выполнить любую конкретную задачу, поскольку в долгосрочной перспективе он повышает удобочитаемость. Эта задача может быть выполнена с использованием наивного метода и, следовательно, может быть сведена к пониманию списка.
test_list
=
[
'GeeksforGeeks'
,
'Geeky'
,
'Computers'
,
'Algorithms'
]
print
(
"The original list is : "
+
str
(test_list))
subs
=
'Geek'
res
=
[i
for
i
in
test_list
if
subs
in
i]
print
(
"All strings with given substring are : "
+
str
(res))
Выход:
The original list is : ['GeeksforGeeks', 'Geeky', 'Computers', 'Algorithms'] All strings with given substring are : ['GeeksforGeeks', 'Geeky']
Способ № 2: Использование filter()
+ лямбда
Эта функция также может выполнять эту задачу поиска строк с помощью лямбды. Он просто отфильтровывает все строки, соответствующие определенной подстроке, а затем добавляет его в новый список.
test_list
=
[
'GeeksforGeeks'
,
'Geeky'
,
'Computers'
,
'Algorithms'
]
print
(
"The original list is : "
+
str
(test_list))
subs
=
'Geek'
res
=
list
(
filter
(
lambda
x: subs
in
x, test_list))
print
(
"All strings with given substring are : "
+
str
(res))
Выход:
The original list is : ['GeeksforGeeks', 'Geeky', 'Computers', 'Algorithms'] All strings with given substring are : ['GeeksforGeeks', 'Geeky']
Способ № 3: Использование re + search()
Регулярные выражения могут использоваться для выполнения многих задач в Python. Для выполнения этой конкретной задачи также могут пригодиться регулярные выражения. Он находит всю подходящую подстроку с помощью search()
и возвращает результат.
import
re
test_list
=
[
'GeeksforGeeks'
,
'Geeky'
,
'Computers'
,
'Algorithms'
]
print
(
"The original list is : "
+
str
(test_list))
subs
=
'Geek'
res
=
[x
for
x
in
test_list
if
re.search(subs, x)]
print
(
"All strings with given substring are : "
+
str
(res))
Выход:
The original list is : ['GeeksforGeeks', 'Geeky', 'Computers', 'Algorithms'] All strings with given substring are : ['GeeksforGeeks', 'Geeky']
Рекомендуемые посты:
- Python | Фильтр списка строк на основе списка подстрок
- Python | Заменить подстроку в списке строк
- Python | Проверьте, является ли подстрока частью списка строк
- Python | Поиск частоты в списке кортежей
- Python | Нахождение относительного порядка элементов в списке
- Python | Удалить пустые строки из списка строк
- Python | Токенизация строк в списке строк
- Python | Получить подстроку из заданной строки, используя нарезку списка
- Python | Удаление дубликата подстроки из списка
- Python | Объединить список кортежей в список, соединив строки
- Python | Преобразовать список списков в список строк
- Python | Преобразовать список строк в список кортежей
- Python | Преобразовать список кортежей в список строк
- Python | Фильтровать список на основе заданного списка строк
- Python | Как отсортировать список строк
Python | Поиск строк с заданной подстрокой в списке
0.00 (0%) 0 votes