Как найти строку в списке строк python

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:

Trenton McKinney's user avatar

asked Jan 30, 2011 at 13:29

SandyBr's user avatar

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's user avatar

Mateen Ulhaq

23.7k17 gold badges94 silver badges132 bronze badges

answered Jan 30, 2011 at 13:32

Sven Marnach's user avatar

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

fantabolous's user avatar

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's user avatar

Mateen Ulhaq

23.7k17 gold badges94 silver badges132 bronze badges

answered Jan 30, 2011 at 13:34

MAK's user avatar

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

RogerS's user avatar

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?

Community's user avatar

answered Oct 20, 2011 at 13:24

Robert Muil's user avatar

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's user avatar

jamylak

128k30 gold badges230 silver badges230 bronze badges

answered Jan 30, 2011 at 13:31

Mariy's user avatar

MariyMariy

5,6564 gold badges40 silver badges57 bronze badges

0

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

jamylak's user avatar

jamylak

128k30 gold badges230 silver badges230 bronze badges

answered Jan 30, 2011 at 13:38

Rubycon's user avatar

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

Imran's user avatar

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 Manthalkar's user avatar

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's user avatar

kalehmann

4,7316 gold badges24 silver badges36 bronze badges

answered Feb 8, 2019 at 16:37

Harsh Lodhi's user avatar

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 Shannon's user avatar

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

Lakhani Aliraza's user avatar

mylist=['abc','def','ghi','abc']

pattern=re.compile(r'abc') 

pattern.findall(mylist)

Bugs's user avatar

Bugs

4,4919 gold badges31 silver badges41 bronze badges

answered Jul 4, 2018 at 13:32

arun_munagala's user avatar

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.'s user avatar

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

Chandragupta Borkotoky's user avatar

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’.

Pika Supports Ukraine's user avatar

answered Jan 26, 2019 at 2:44

Jayson Ogso's user avatar

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's user avatar

4b0

21.7k30 gold badges94 silver badges141 bronze badges

answered Jul 18, 2019 at 8:22

Raja Ahsan Zeb's user avatar

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's user avatar

cottontail

7,79218 gold badges37 silver badges47 bronze badges

answered Jun 16, 2018 at 10:52

Soudipta Dutta's user avatar

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'

 

и поднять StopIterationException , если значение не в 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

Добавить комментарий