Как найти количество вхождений символа в строке

Итак, дана строка. Задача состоит в том, чтобы посчитать частоту вхождения одного символа в эту строку. Эта конкретная операция со строкой весьма полезна во многих приложениях и используется например как способ для удаления дубликатов или обнаружения нежелательных символов. Рассмотрим 5 методов.

Метод №1. Наивный

Итерируем всю строку для поиска этого конкретного символа, а затем увеличиваем счетчик, когда мы сталкиваемся с этим символом.

# Python3 code to demonstrate 
# occurrence frequency using 
# naive method 

# initializing string 
test_str = "Pythonist"

# using naive method to get count 
# counting t 
count = 0

for i in test_str: 
	if i == 't': 
		count = count + 1

# printing result 
print ("Count of t in Pythonist is : "
							+ str(count)) 
Count of t in Pythonist is : 2

Метод №2. Используем count()

Использование count() — самый обычный метод в Python, для того чтобы получить вхождения любого элемента в любом контейнере. Его легко написать и запомнить и, следовательно, его использование довольно популярно.

# Python3 code to demonstrate  
# occurrence frequency using  
# count() 
  
# initializing string  
test_str = "Pythonist"
  
# using count() to get count  
# counting t
counter = test_str.count('t') 
  
# printing result  
print ("Count of t in Pythonist is : "
                           +  str(counter)) 
 Count of e in Pythonist is : 2 

Метод №3: Используем collection.Counter ()

Это менее известный метод для получения количества вхождений элемента в любой контейнер в Python. Он также выполняет задачу, аналогичную описанным выше двум методам, просто является функцией другой библиотеки, т.е. collections.

# Python3 code to demonstrate  
# occurrence frequency using  
# collections.Counter() 
from collections import Counter 
  
# initializing string  
test_str = "Pythonist"
  
# using collections.Counter() to get count  
# counting t  
count = Counter(test_str) 
  
# printing result  
print ("Count of t in Pythonist is : "
                       +  str(count['t']))
  Count of t in Pythonist is : 2 

Способ №4: Используем lambda, sum() и map()

Лямбда-функции вместе с sum() и map() также могут решить конкретно эту задачу подсчета общего числа вхождений определенного элемента в строку. Этот метод использует sum() для суммирования всех вхождений, полученных с помощью map().

# Python3 code to demonstrate  
# occurrence frequency using  
# lambda + sum() + map() 
  
# initializing string  
test_str = "Pythonist"
  
# using lambda + sum() + map() to get count  
# counting t  
count = sum(map(lambda x : 1 if 't' in x else 0, test_str)) 
  
# printing result  
print ("Count of t in Pythonist is : "
                            +  str(count)) 
Count of t in Pythonist is : 2

Способ №5: Используем re + findall()

Регулярные выражения могут помочь нам решить множество задач программирования, связанных со строками. Они также могут помочь нам в достижении результата в задаче поиска вхождения элемента в строку.

# Python3 code to demonstrate  
# occurrence frequency using  
# re + findall() 
import re 
  
# initializing string  
test_str = "Pythonist"
  
# using re + findall() to get count  
# counting t  
count = len(re.findall("t", test_str)) 
  
# printing result  
print ("Count of t in Pythonist is : "
                            +  str(count)) 
 Count of t in Pythonist is : 2 

Asked
13 years, 10 months ago

Viewed
1.6m times

How do I count the number of occurrences of a character in a string?

e.g. 'a' appears in 'Mary had a little lamb' 4 times.

Mateen Ulhaq's user avatar

Mateen Ulhaq

23.8k18 gold badges95 silver badges132 bronze badges

asked Jul 20, 2009 at 20:00

Mat's user avatar

2

str.count(sub[, start[, end]])

Return the number of non-overlapping occurrences of substring sub in the range [start, end]. Optional arguments start and end are interpreted as in slice notation.

>>> sentence = 'Mary had a little lamb'
>>> sentence.count('a')
4

Mateen Ulhaq's user avatar

Mateen Ulhaq

23.8k18 gold badges95 silver badges132 bronze badges

answered Jul 20, 2009 at 20:04

Ogre Codes's user avatar

Ogre CodesOgre Codes

18.4k1 gold badge16 silver badges24 bronze badges

2

You can use .count() :

>>> 'Mary had a little lamb'.count('a')
4

Mateen Ulhaq's user avatar

Mateen Ulhaq

23.8k18 gold badges95 silver badges132 bronze badges

answered Jul 20, 2009 at 20:04

eduffy's user avatar

eduffyeduffy

38.9k13 gold badges95 silver badges92 bronze badges

To get the counts of all letters, use collections.Counter:

>>> from collections import Counter
>>> counter = Counter("Mary had a little lamb")
>>> counter['a']
4

Mateen Ulhaq's user avatar

Mateen Ulhaq

23.8k18 gold badges95 silver badges132 bronze badges

answered Aug 1, 2012 at 22:12

Brenden Brown's user avatar

Brenden BrownBrenden Brown

3,1051 gold badge14 silver badges15 bronze badges

4

Regular expressions maybe?

import re
my_string = "Mary had a little lamb"
len(re.findall("a", my_string))

answered Jul 20, 2009 at 20:03

Sinan Taifour's user avatar

Sinan TaifourSinan Taifour

10.4k3 gold badges32 silver badges30 bronze badges

6

Python-3.x:

"aabc".count("a")

str.count(sub[, start[, end]])

Return the number of non-overlapping occurrences of substring sub in the range [start, end]. Optional arguments start and end are interpreted as in slice notation.

tremendows's user avatar

tremendows

4,2173 gold badges33 silver badges51 bronze badges

answered Jul 20, 2009 at 20:05

Aaron Fi's user avatar

Aaron FiAaron Fi

10k13 gold badges66 silver badges91 bronze badges

1

myString.count('a');

more info here

answered Jul 20, 2009 at 20:04

Finer Recliner's user avatar

Finer ReclinerFiner Recliner

1,5791 gold badge13 silver badges21 bronze badges

str.count(a) is the best solution to count a single character in a string. But if you need to count more characters you would have to read the whole string as many times as characters you want to count.

A better approach for this job would be:

from collections import defaultdict

text = 'Mary had a little lamb'
chars = defaultdict(int)

for char in text:
    chars[char] += 1

So you’ll have a dict that returns the number of occurrences of every letter in the string and 0 if it isn’t present.

>>>chars['a']
4
>>>chars['x']
0

For a case insensitive counter you could override the mutator and accessor methods by subclassing defaultdict (base class’ ones are read-only):

class CICounter(defaultdict):
    def __getitem__(self, k):
        return super().__getitem__(k.lower())

    def __setitem__(self, k, v):
        super().__setitem__(k.lower(), v)


chars = CICounter(int)

for char in text:
    chars[char] += 1

>>>chars['a']
4
>>>chars['M']
2
>>>chars['x']
0

answered Oct 2, 2016 at 2:33

Nuno André's user avatar

Nuno AndréNuno André

4,5111 gold badge31 silver badges44 bronze badges

3

This easy and straight forward function might help:

def check_freq(x):
    freq = {}
    for c in set(x):
       freq[c] = x.count(c)
    return freq

check_freq("abbabcbdbabdbdbabababcbcbab")
{'a': 7, 'b': 14, 'c': 3, 'd': 3}

If a comprehension is desired:

def check_freq(x):
    return {c: x.count(c) for c in set(x)}

rayryeng's user avatar

rayryeng

103k22 gold badges182 silver badges192 bronze badges

answered Mar 20, 2018 at 13:19

Erick Mwazonga's user avatar

0

Regular expressions are very useful if you want case-insensitivity (and of course all the power of regex).

my_string = "Mary had a little lamb"
# simplest solution, using count, is case-sensitive
my_string.count("m")   # yields 1
import re
# case-sensitive with regex
len(re.findall("m", my_string))
# three ways to get case insensitivity - all yield 2
len(re.findall("(?i)m", my_string))
len(re.findall("m|M", my_string))
len(re.findall(re.compile("m",re.IGNORECASE), my_string))

Be aware that the regex version takes on the order of ten times as long to run, which will likely be an issue only if my_string is tremendously long, or the code is inside a deep loop.

answered Dec 5, 2014 at 17:04

jafelds's user avatar

jafeldsjafelds

8948 silver badges12 bronze badges

1

I don’t know about ‘simplest’ but simple comprehension could do:

>>> my_string = "Mary had a little lamb"
>>> sum(char == 'a' for char in my_string)
4

Taking advantage of built-in sum, generator comprehension and fact that bool is subclass of integer: how may times character is equal to ‘a’.

answered Sep 20, 2020 at 8:55

Aivar Paalberg's user avatar

Aivar PaalbergAivar Paalberg

4,5114 gold badges16 silver badges17 bronze badges

a = 'have a nice day'
symbol = 'abcdefghijklmnopqrstuvwxyz'
for key in symbol:
    print(key, a.count(key))

questionto42's user avatar

questionto42

6,4944 gold badges52 silver badges83 bronze badges

answered Oct 24, 2015 at 22:36

rookie's user avatar

rookierookie

611 silver badge1 bronze badge

0

count is definitely the most concise and efficient way of counting the occurrence of a character in a string but I tried to come up with a solution using lambda, something like this :

sentence = 'Mary had a little lamb'
sum(map(lambda x : 1 if 'a' in x else 0, sentence))

This will result in :

4

Also, there is one more advantage to this is if the sentence is a list of sub-strings containing same characters as above, then also this gives the correct result because of the use of in. Have a look :

sentence = ['M', 'ar', 'y', 'had', 'a', 'little', 'l', 'am', 'b']
sum(map(lambda x : 1 if 'a' in x else 0, sentence))

This also results in :

4

But Of-course this will work only when checking occurrence of single character such as 'a' in this particular case.

answered Mar 28, 2017 at 17:13

Satish Prakash Garg's user avatar

An alternative way to get all the character counts without using Counter(), count and regex

counts_dict = {}
for c in list(sentence):
  if c not in counts_dict:
    counts_dict[c] = 0
  counts_dict[c] += 1

for key, value in counts_dict.items():
    print(key, value)

answered Mar 7, 2019 at 9:04

Syed Shamikh Shabbir's user avatar

I am a fan of the pandas library, in particular the value_counts() method. You could use it to count the occurrence of each character in your string:

>>> import pandas as pd
>>> phrase = "I love the pandas library and its `value_counts()` method"
>>> pd.Series(list(phrase)).value_counts()
     8
a    5
e    4
t    4
o    3
n    3
s    3
d    3
l    3
u    2
i    2
r    2
v    2
`    2
h    2
p    1
b    1
I    1
m    1
(    1
y    1
_    1
)    1
c    1
dtype: int64

answered Jan 19, 2020 at 9:23

Sébastien Wieckowski's user avatar

1

a = "I walked today,"
c=['d','e','f']
count=0
for i in a:
    if str(i) in c:
        count+=1

print(count)

answered Sep 29, 2020 at 3:27

Kquek's user avatar

KquekKquek

574 bronze badges

2

I know the ask is to count a particular letter. I am writing here generic code without using any method.

sentence1 =" Mary had a little lamb"
count = {}
for i in sentence1:
    if i in count:
        count[i.lower()] = count[i.lower()] + 1
    else:
        count[i.lower()] = 1
print(count)

output

{' ': 5, 'm': 2, 'a': 4, 'r': 1, 'y': 1, 'h': 1, 'd': 1, 'l': 3, 'i': 1, 't': 2, 'e': 1, 'b': 1}

Now if you want any particular letter frequency, you can print like below.

print(count['m'])
2

answered Feb 3, 2021 at 11:42

Rishi Bansal's user avatar

Rishi BansalRishi Bansal

3,7243 gold badges27 silver badges46 bronze badges

the easiest way is to code in one line:

'Mary had a little lamb'.count("a")

but if you want can use this too:

sentence ='Mary had a little lamb'
   count=0;
    for letter in sentence :
        if letter=="a":
            count+=1
    print (count)

answered Dec 21, 2021 at 13:34

fsafarkhani's user avatar

3

Python 3

Ther are two ways to achieve this:

1) With built-in function count()

sentence = 'Mary had a little lamb'
print(sentence.count('a'))`

2) Without using a function

sentence = 'Mary had a little lamb'    
count = 0

for i in sentence:
    if i == "a":
        count = count + 1

print(count)

answered Sep 7, 2019 at 20:16

Dipen Gajjar's user avatar

Dipen GajjarDipen Gajjar

1,27814 silver badges23 bronze badges

To find the occurrence of characters in a sentence you may use the below code

Firstly, I have taken out the unique characters from the sentence and then I counted the occurrence of each character in the sentence these includes the occurrence of blank space too.

ab = set("Mary had a little lamb")

test_str = "Mary had a little lamb"

for i in ab:
  counter = test_str.count(i)
  if i == ' ':
    i = 'Space'
  print(counter, i)

Output of the above code is below.

1 : r ,
1 : h ,
1 : e ,
1 : M ,
4 : a ,
1 : b ,
1 : d ,
2 : t ,
3 : l ,
1 : i ,
4 : Space ,
1 : y ,
1 : m ,

answered Sep 23, 2021 at 5:06

Shreyansh Dwivedi's user avatar

5

“Without using count to find you want character in string” method.

import re

def count(s, ch):

   pass

def main():

   s = raw_input ("Enter strings what you like, for example, 'welcome': ")  

   ch = raw_input ("Enter you want count characters, but best result to find one character: " )

   print ( len (re.findall ( ch, s ) ) )

main()

Sebastián Palma's user avatar

answered Jan 11, 2015 at 17:24

B-Y's user avatar

B-YB-Y

1871 gold badge2 silver badges12 bronze badges

1

This is an extension of the accepted answer, should you look for the count of all the characters in the text.

# Objective: we will only count for non-empty characters

text = "count a character occurrence"
unique_letters = set(text)
result = dict((x, text.count(x)) for x in unique_letters if x.strip())

print(result)
# {'a': 3, 'c': 6, 'e': 3, 'u': 2, 'n': 2, 't': 2, 'r': 3, 'h': 1, 'o': 2}

CypherX's user avatar

CypherX

6,8493 gold badges24 silver badges37 bronze badges

answered Apr 1, 2016 at 1:29

Thiru G's user avatar

2

Use count:

sentence = 'A man walked up to a door'
print(sentence.count('a'))
# 4

answered Jan 8 at 14:46

Pythoneer's user avatar

PythoneerPythoneer

3991 silver badge16 bronze badges

Taking up a comment of this user:

import numpy as np
sample = 'samplestring'
np.unique(list(sample), return_counts=True)

Out:

(array(['a', 'e', 'g', 'i', 'l', 'm', 'n', 'p', 'r', 's', 't'], dtype='<U1'),
 array([1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1]))

Check ‘s’. You can filter this tuple of two arrays as follows:

a[1][a[0]=='s']

Side-note: It works like Counter() of the collections package, just in numpy, which you often import anyway. You could as well count the unique words in a list of words instead.

answered Dec 29, 2021 at 19:29

questionto42's user avatar

questionto42questionto42

6,4944 gold badges52 silver badges83 bronze badges

No more than this IMHO – you can add the upper or lower methods

def count_letter_in_str(string,letter):
    return string.count(letter)

answered Feb 23, 2016 at 19:16

Tim Seed's user avatar

Tim SeedTim Seed

5,0572 gold badges30 silver badges26 bronze badges

You can use loop and dictionary.

def count_letter(text):
    result = {}
    for letter in text:
        if letter not in result:
            result[letter] = 0
        result[letter] += 1
    return result

blackbishop's user avatar

blackbishop

30.4k11 gold badges55 silver badges74 bronze badges

answered Dec 24, 2021 at 10:03

Amit pratap singh's user avatar

spam = 'have a nice day'
var = 'd'


def count(spam, var):
    found = 0
    for key in spam:
        if key == var:
            found += 1
    return found
count(spam, var)
print 'count %s is: %s ' %(var, count(spam, var))

poolie's user avatar

poolie

9,2291 gold badge47 silver badges74 bronze badges

answered Nov 15, 2015 at 19:05

rookie's user avatar

Есть необходимость реализовать проверку на наличие нескольких запятых в строке. Т.е. можно использовать только одну запятую.

Но в целом достаточно узнать количество вхождений символа в строку. Остальное дописать не будет проблемой.

Какие есть способы это (посчитать количество вхождений символа) сделать?

Алексей Шиманский's user avatar

задан 3 окт 2017 в 7:23

iFr0z's user avatar

0

  1. Регулярка
  2. Использовать StringUtils.countMatches из org.apache.commons.lang3.StringUtils

    int occurrence = StringUtils.countMatches("a,b,c,d", ",");
    System.out.println(occurrence);
    
  3. Использовать string.split

    String string = "a,b,c,d";
    String []splitArray = string.split("\,");
    System.out.println("Запятых тут : " + (splitArray.length - 1) + " штук.");
    
  4. String testString =  "a,b,c,d";
    int occurrencesCount = testString.length() - testString.replace(",", "").length();
    System.out.println(occurrencesCount);
    
  5. Java8

    String testString =  "a,b,c,d";
    long occurrencesCount = testString.chars().filter(ch -> ch == ',').count();
    System.out.println(occurrencesCount);
    
  6. Еще какой-нибудь способ


UPD нашел подобную тему на enSO: How do I count the number of occurrences of a char in a String?, несколько примеров оттуда:

  • Spring Framework

    int spring = org.springframework.util.StringUtils.countOccurrencesOf(testString, ",");
    System.out.println("spring = " + spring);
    
  • replaceAll

    int replaceAll = testString.replaceAll("[^,]", "").length();
    System.out.println("replaceAll = " + replaceAll);
    
  • Java8

    long java8 = testString.codePoints().filter(ch -> ch == ',').count();
    System.out.println("java8 = " + java8);
    
  • StringTokenizer

    int stringTokenizer = new StringTokenizer(" " +testString + " ", ",").countTokens()-1;
    System.out.println("stringTokenizer = " + stringTokenizer);
    

    Но в данном случае надо быть осторожным, так как, например, для строки a.b.c.d этот пример будет работать, а для строки a…b.c….d или …a.b.c.d или a….b……c…..d… и т.д. — не будет. В итоге последовательность точек между каждой из букв посчитается лишь за один символ.

ответ дан 3 окт 2017 в 7:31

Алексей Шиманский's user avatar

Алексей ШиманскийАлексей Шиманский

72.2k11 золотых знаков87 серебряных знаков173 бронзовых знака

3

Если вопрос только в том, чтобы узнать больше ли одной запятой, то самый простой вариант такой:

String testString =  "a,b,c,d";
boolean isMoreThanOne = testString.indexOf(',') != testString.lastIndexOf(',');
System.out.println("More than one: " + isMoreThanOne);

ответ дан 3 окт 2017 в 8:26

Eugene Krivenja's user avatar

Eugene KrivenjaEugene Krivenja

11.6k3 золотых знака23 серебряных знака33 бронзовых знака

2

В этом посте будет обсуждаться, как подсчитывать вхождения символа в заданной строке в C++.

1. Использование std::string::find функция

Мы можем использовать std::string::find для поиска в строке первого вхождения указанного символа, начиная с указанной позиции в строке. Возвращает позицию первого вхождения указанного символа или string::npos если персонаж не найден.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

#include <iostream>

#include <string>

int main()

{

    std::string s = “C++,Java”;

    char ch = ‘+’;

    int count = 0;

    for (int i = 0; (i = s.find(ch, i)) != std::string::npos; i++) {

        count++;

    }

    std::cout << “Character “ << ch << ” occurs “ << count << ” times”;

    return 0;

}

Скачать  Выполнить код

результат:

Character + occurs 2 times

2. Использование std::count функция

Мы можем упростить вещи, используя стандартный алгоритм std::count определено в <algorithm> заголовок. Он возвращает общее количество элементов, соответствующих указанному значению в заданном диапазоне.

#include <iostream>

#include <algorithm>

#include <string>

int main()

{

    std::string s = “C++,Java”;

    char ch = ‘+’;

    int count = std::count(s.begin(), s.end(), ch);

    std::cout << “Character “ << ch << ” occurs “ << count << ” times”;

    return 0;

}

Скачать  Выполнить код

результат:

Character + occurs 2 times

3. Использование std::count_if функция

Наконец, мы также можем использовать std::count_if который использует указанный предикат для сравнения, в отличие от std::count, который использует == оператор.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

#include <iostream>

#include <algorithm>

#include <string>

int main()

{

    std::string s = “C++,Java”;

    char ch = ‘+’;

    int count = std::count_if (s.begin(), s.end(),

                            [&ch](char c) {

                                return c == ch;

                            });

    std::cout << “Character “ << ch << ” occurs “ << count << ” times”;

    return 0;

}

Скачать  Выполнить код

результат:

Character + occurs 2 times

4. Использование Boost

Если вы не хотите использовать библиотеку STL, вы можете использовать boost count() функция определена в заголовочном файле boost/range/algorithm/count.hpp.

#include <iostream>

#include <string>

#include <boost/range/algorithm/count.hpp>

int main()

{

    std::string s = “C++,Java”;

    char ch = ‘+’;

    int count = boost::count(s, ch);

    std::cout << “Character “ << ch << ” occurs “ << count << ” times”;

    return 0;

}

Скачать код

результат:

Character + occurs 2 times

Это все, что касается подсчета вхождений char в строку в C++.

Я начал вести список наиболее часто используемых функций, решая алгоритмические задачи на LeetCode и HackerRank.

Быть хорошим программистом — это не значит помнить все встроенные функции некоего языка. Но это не означает и того, что их запоминание — бесполезное дело. Особенно — если речь идёт о подготовке к собеседованию.

Хочу сегодня поделиться со всеми желающими моей шпаргалкой по работе со строками в Python. Я оформил её в виде списка вопросов, который использую для самопроверки. Хотя эти вопросы и не тянут на полноценные задачи, которые предлагаются на собеседованиях, их освоение поможет вам в решении реальных задач по программированию.

1. Как проверить два объекта на идентичность?

Оператор is возвращает True в том случае, если в две переменные записана ссылка на одну и ту же область памяти. Именно об этом идёт речь при разговоре об «идентичности объектов».

Не стоит путать is и ==. Оператор == проверяет лишь равенство объектов.

animals           = ['python','gopher']
more_animals      = animals
print(animals == more_animals) #=> True
print(animals is more_animals) #=> True
even_more_animals = ['python','gopher']
print(animals == even_more_animals) #=> True
print(animals is even_more_animals) #=> False

Обратите внимание на то, что animals и even_more_animals не идентичны, хотя и равны друг другу.

Кроме того, существует функция id(), которая возвращает идентификатор адреса памяти, связанного с именем переменной. При вызове этой функции для двух идентичных объектов будет выдан один и тот же идентификатор.

name = 'object'
id(name)
#=> 4408718312

2. Как проверить то, что каждое слово в строке начинается с заглавной буквы?

Существует строковый метод istitle(), который проверяет, начинается ли каждое слово в строке с заглавной буквы.

print( 'The Hilton'.istitle() ) #=> True
print( 'The dog'.istitle() ) #=> False
print( 'sticky rice'.istitle() ) #=> False

3. Как проверить строку на вхождение в неё другой строки?

Существует оператор in, который вернёт True в том случае, если строка содержит искомую подстроку.

print( 'plane' in 'The worlds fastest plane' ) #=> True
print( 'car' in 'The worlds fastest plane' ) #=> False

4. Как найти индекс первого вхождения подстроки в строку?

Есть два метода, возвращающих индекс первого вхождения подстроки в строку. Это — find() и index(). У каждого из них есть определённые особенности.

Метод find() возвращает -1 в том случае, если искомая подстрока в строке не найдена.

'The worlds fastest plane'.find('plane') #=> 19
'The worlds fastest plane'.find('car') #=> -1

Метод index() в подобной ситуации выбрасывает ошибку ValueError.

'The worlds fastest plane'.index('plane') #=> 19
'The worlds fastest plane'.index('car') #=> ValueError: substring not found

5. Как подсчитать количество символов в строке?

Функция len() возвращает длину строки.

len('The first president of the organization..') #=> 41

6. Как подсчитать то, сколько раз определённый символ встречается в строке?

Ответить на этот вопрос нам поможет метод count(), который возвращает количество вхождений в строку заданного символа.

'The first president of the organization..'.count('o') #=> 3

7. Как сделать первый символ строки заглавной буквой?

Для того чтобы это сделать, можно воспользоваться методом capitalize().

'florida dolphins'.capitalize() #=> 'Florida dolphins'

8. Что такое f-строки и как ими пользоваться?

В Python 3.6 появилась новая возможность — так называемые «f-строки». Их применение чрезвычайно упрощает интерполяцию строк. Использование f-строк напоминает применение метода format().

При объявлении f-строк перед открывающей кавычкой пишется буква f.

name = 'Chris'
food = 'creme brulee'
f'Hello. My name is {name} and I like {food}.'
#=> 'Hello. My name is Chris and I like creme brulee'

9. Как найти подстроку в заданной части строки?

Метод index() можно вызывать, передавая ему необязательные аргументы, представляющие индекс начального и конечного фрагмента строки, в пределах которых и нужно осуществлять поиск подстроки.

'the happiest person in the whole wide world.'.index('the',10,44)
#=> 23

Обратите внимание на то, что вышеприведённая конструкция возвращает 23, а не 0, как было бы, не ограничь мы поиск.

'the happiest person in the whole wide world.'.index('the')
#=> 0

10. Как вставить содержимое переменной в строку, воспользовавшись методом format()?

Метод format() позволяет добиваться результатов, сходных с теми, которые можно получить, применяя f-строки. Правда, я полагаю, что использовать format() не так удобно, так как все переменные приходится указывать в качестве аргументов format().

difficulty = 'easy'
thing = 'exam'
'That {} was {}!'.format(thing, difficulty)
#=> 'That exam was easy!'

11. Как узнать о том, что в строке содержатся только цифры?

Существует метод isnumeric(), который возвращает True в том случае, если все символы, входящие в строку, являются цифрами.

'80000'.isnumeric() #=> True

Используя этот метод, учитывайте то, что знаки препинания он цифрами не считает.

'1.0'.isnumeric() #=> False

12. Как разделить строку по заданному символу?

Здесь нам поможет метод split(), который разбивает строку по заданному символу или по нескольким символам.

'This is great'.split(' ')
#=> ['This', 'is', 'great']
'not--so--great'.split('--')
#=> ['not', 'so', 'great']

13. Как проверить строку на то, что она составлена только из строчных букв?

Метод islower() возвращает True только в том случае, если строка составлена исключительно из строчных букв.

'all lower case'.islower() #=> True
'not aLL lowercase'.islower() # False

14. Как проверить то, что строка начинается со строчной буквы?

Сделать это можно, вызвав вышеописанный метод islower() для первого символа строки.

'aPPLE'[0].islower() #=> True

15. Можно ли в Python прибавить целое число к строке?

В некоторых языках это возможно, но Python при попытке выполнения подобной операции будет выдана ошибка TypeError.

'Ten' + 10 #=> TypeError

16. Как «перевернуть» строку?

Для того чтобы «перевернуть» строку, её можно разбить, представив в виде списка символов, «перевернуть» список, и, объединив его элементы, сформировать новую строку.

''.join(reversed("hello world"))
#=> 'dlrow olleh'

17. Как объединить список строк в одну строку, элементы которой разделены дефисами?

Метод join() умеет объединять элементы списков в строки, разделяя отдельные строки с использованием заданного символа.

'-'.join(['a','b','c'])
#=> 'a-b-c'

18. Как узнать о том, что все символы строки входят в ASCII?

Метод isascii() возвращает True в том случае, если все символы, имеющиеся в строке, входят в ASCII.

print( 'Â'.isascii() ) #=> False
print( 'A'.isascii() ) #=> True

19. Как привести всю строку к верхнему или нижнему регистру?

Для решения этих задач можно воспользоваться методами upper() и lower(), которые, соответственно, приводят все символы строк к верхнему и нижнему регистрам.

sentence = 'The Cat in the Hat'
sentence.upper() #=> 'THE CAT IN THE HAT'
sentence.lower() #=> 'the cat in the hat'

20. Как преобразовать первый и последний символы строки к верхнему регистру?

Тут, как и в одном из предыдущих примеров, мы будем обращаться к символам строки по индексам. Строки в Python иммутабельны, поэтому мы будем заниматься сборкой новой строки на основе существующей.

animal = 'fish'
animal[0].upper() + animal[1:-1] + animal[-1].upper()
#=> 'FisH'

21. Как проверить строку на то, что она составлена только из прописных букв?

Имеется метод isupper(), который похож на уже рассмотренный islower(). Но isupper() возвращает True только в том случае, если вся строка состоит из прописных букв.

'Toronto'.isupper() #=> False
'TORONTO'.isupper() #= True

22. В какой ситуации вы воспользовались бы методом splitlines()?

Метод splitlines() разделяет строки по символам разрыва строки.

sentence = "It was a stormy nightnThe house creekednThe wind blew."
sentence.splitlines()
#=> ['It was a stormy night', 'The house creeked', 'The wind blew.']

23. Как получить срез строки?

Для получения среза строки используется синтаксическая конструкция следующего вида:

string[start_index:end_index:step]

Здесь step — это шаг, с которым будут возвращаться символы строки из диапазона start_index:end_index. Значение step, равное 3, указывает на то, что возвращён будет каждый третий символ.

string = 'I like to eat apples'
string[:6] #=> 'I like'
string[7:13] #=> 'to eat'
string[0:-1:2] #=> 'Ilk oetape' (каждый 2-й символ)

24. Как преобразовать целое число в строку?

Для преобразования числа в строку можно воспользоваться конструктором str().

str(5) #=> '5'

25. Как узнать о том, что строка содержит только алфавитные символы?

Метод isalpha() возвращает True в том случае, если все символы в строке являются буквами.

'One1'.isalpha() #=> False
'One'.isalpha() #=> True

26. Как в заданной строке заменить на что-либо все вхождения некоей подстроки?

Если обойтись без экспорта модуля, позволяющего работать с регулярными выражениями, то для решения этой задачи можно воспользоваться методом replace().

sentence = 'Sally sells sea shells by the sea shore'
sentence.replace('sea', 'mountain')
#=> 'Sally sells mountain shells by the mountain shore'

27. Как вернуть символ строки с минимальным ASCII-кодом?

Если взглянуть на ASCII-коды элементов, то окажется, например, что прописные буквы имеют меньшие коды, чем строчные. Функция min() возвращает символ строки, имеющий наименьший код.

min('strings') #=> 'g'

28. Как проверить строку на то, что в ней содержатся только алфавитно-цифровые символы?

В состав алфавитно-цифровых символов входят буквы и цифры. Для ответа на этот вопрос можно воспользоваться методом isalnum().

'Ten10'.isalnum() #=> True
'Ten10.'.isalnum() #=> False

29. Как удалить пробелы из начала строки (из её левой части), из её конца (из правой части), или с обеих сторон строки?

Здесь нам пригодятся, соответственно, методы lstrip(), rstrip() и strip().

string = '  string of whitespace    '
string.lstrip() #=> 'string of whitespace    '
string.rstrip() #=> '  string of whitespace'
string.strip() #=> 'string of whitespace'

30. Как проверить то, что строка начинается с заданной последовательности символов, или заканчивается заданной последовательностью символов?

Для ответа на этот вопрос можно прибегнуть, соответственно, к методам startswith() и endswith().

city = 'New York'
city.startswith('New') #=> True
city.endswith('N') #=> False

31. Как закодировать строку в ASCII?

Метод encode() позволяет кодировать строки с использованием заданной кодировки. По умолчанию используется кодировка utf-8. Если некий символ не может быть представлен с использованием заданной кодировки, будет выдана ошибка UnicodeEncodeError.

'Fresh Tuna'.encode('ascii')
#=> b'Fresh Tuna'
'Fresh Tuna Â'.encode('ascii')
#=> UnicodeEncodeError: 'ascii' codec can't encode character 'xc2' in position 11: ordinal not in range(128)

32. Как узнать о том, что строка включает в себя только пробелы?

Есть метод isspace(), который возвращает True только в том случае, если строка состоит исключительно из пробелов.

''.isspace() #=> False
' '.isspace() #=> True
'   '.isspace() #=> True
' the '.isspace() #=> False

33. Что случится, если умножить некую строку на 3?

Будет создана новая строка, представляющая собой исходную строку, повторённую три раза.

'dog' * 3
# 'dogdogdog'

34. Как привести к верхнему регистру первый символ каждого слова в строке?

Существует метод title(), приводящий к верхнему регистру первую букву каждого слова в строке.

'once upon a time'.title() #=> 'Once Upon A Time'

35. Как объединить две строки?

Для объединения строк можно воспользоваться оператором +.

'string one' + ' ' + 'string two' 
#=> 'string one string two'

36. Как пользоваться методом partition()?

Метод partition() разбивает строку по заданной подстроке. После этого результат возвращается в виде кортежа. При этом подстрока, по которой осуществлялась разбивка, тоже входит в кортеж.

sentence = "If you want to be a ninja"
print(sentence.partition(' want '))
#=> ('If you', ' want ', 'to be a ninja')

37. Строки в Python иммутабельны. Что это значит?

То, что строки иммутабельны, говорит о том, что после того, как создан объект строки, он не может быть изменён. При «модификации» строк исходные строки не меняются. Вместо этого в памяти создаются совершенно новые объекты. Доказать это можно, воспользовавшись функцией id().

proverb = 'Rise each day before the sun'
print( id(proverb) )
#=> 4441962336
proverb_two = 'Rise each day before the sun' + ' if its a weekday'
print( id(proverb_two) )
#=> 4442287440

При конкатенации 'Rise each day before the sun' и ' if its a weekday' в памяти создаётся новый объект, имеющий новый идентификатор. Если бы исходный объект менялся бы, тогда у объектов был бы один и тот же идентификатор.

38. Если объявить одну и ту же строку дважды (записав её в 2 разные переменные) — сколько объектов будет создано в памяти? 1 или 2?

В качестве примера подобной работы со строками можно привести такой фрагмент кода:

animal = 'dog'
pet = 'dog'

При таком подходе в памяти создаётся лишь один объект. Когда я столкнулся с этим в первый раз, мне это не показалось интуитивно понятным. Но этот механизм помогает Python экономить память при работе с длинными строками.

Доказать это можно, прибегнув к функции id().

animal = 'dog'
print( id(animal) )
#=> 4441985688
pet = 'dog'
print( id(pet) )
#=> 4441985688

39. Как пользоваться методами maketrans() и translate()?

Метод maketrans() позволяет описать отображение одних символов на другие, возвращая таблицу преобразования.

Метод translate() позволяет применить заданную таблицу для преобразования строки.

# создаём отображение
mapping = str.maketrans("abcs", "123S")
# преобразуем строку
"abc are the first three letters".translate(mapping)
#=> '123 1re the firSt three letterS'

Обратите внимание на то, что в строке произведена замена символов a, b, c и s, соответственно, на символы 1, 2, 3 и S.

40. Как убрать из строки гласные буквы?

Один из ответов на этот вопрос заключается в том, что символы строки перебирают, пользуясь механизмом List Comprehension. Символы проверяют, сравнивая с кортежем, содержащим гласные буквы. Если символ не входит в кортеж — он присоединяется к новой строке.

string = 'Hello 1 World 2'
vowels = ('a','e','i','o','u')
''.join([c for c in string if c not in vowels])
#=> 'Hll 1 Wrld 2'

41. В каких ситуациях пользуются методом rfind()?

Метод rfind() похож на метод find(), но он, в отличие от find(), просматривает строку не слева направо, а справа налево, возвращая индекс первого найденного вхождения искомой подстроки.

story = 'The price is right said Bob. The price is right.'
story.rfind('is')
#=> 39

Итоги

Я часто объясняю одному продакт-менеджеру, человеку в возрасте, что разработчики — это не словари, хранящие описания методов объектов. Но чем больше методов помнит разработчик — тем меньше ему придётся гуглить, и тем быстрее и приятнее ему будет работаться. Надеюсь, теперь вы без труда ответите на рассмотренные здесь вопросы.

Уважаемые читатели! Что, касающееся обработки строк в Python, вы посоветовали бы изучить тем, кто готовится к собеседованию?

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