Итак, дана строка. Задача состоит в том, чтобы посчитать частоту вхождения одного символа в эту строку. Эта конкретная операция со строкой весьма полезна во многих приложениях и используется например как способ для удаления дубликатов или обнаружения нежелательных символов. Рассмотрим 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
23.8k18 gold badges95 silver badges132 bronze badges
asked Jul 20, 2009 at 20:00
2
str.count(sub[, start[, end]])
Return the number of non-overlapping occurrences of substring
sub
in the range[start, end]
. Optional argumentsstart
andend
are interpreted as in slice notation.
>>> sentence = 'Mary had a little lamb'
>>> sentence.count('a')
4
Mateen Ulhaq
23.8k18 gold badges95 silver badges132 bronze badges
answered Jul 20, 2009 at 20:04
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
23.8k18 gold badges95 silver badges132 bronze badges
answered Jul 20, 2009 at 20:04
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
23.8k18 gold badges95 silver badges132 bronze badges
answered Aug 1, 2012 at 22:12
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 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
4,2173 gold badges33 silver badges51 bronze badges
answered Jul 20, 2009 at 20:05
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 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é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
103k22 gold badges182 silver badges192 bronze badges
answered Mar 20, 2018 at 13:19
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
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 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
6,4944 gold badges52 silver badges83 bronze badges
answered Oct 24, 2015 at 22:36
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
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
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
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
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 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
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 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
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()
answered Jan 11, 2015 at 17:24
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
6,8493 gold badges24 silver badges37 bronze badges
answered Apr 1, 2016 at 1:29
2
Use count:
sentence = 'A man walked up to a door'
print(sentence.count('a'))
# 4
answered Jan 8 at 14:46
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
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 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
30.4k11 gold badges55 silver badges74 bronze badges
answered Dec 24, 2021 at 10:03
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
9,2291 gold badge47 silver badges74 bronze badges
answered Nov 15, 2015 at 19:05
Есть необходимость реализовать проверку на наличие нескольких запятых в строке. Т.е. можно использовать только одну запятую.
Но в целом достаточно узнать количество вхождений символа в строку. Остальное дописать не будет проблемой.
Какие есть способы это (посчитать количество вхождений символа) сделать?
задан 3 окт 2017 в 7:23
0
- Регулярка
-
Использовать
StringUtils.countMatches
из org.apache.commons.lang3.StringUtilsint occurrence = StringUtils.countMatches("a,b,c,d", ","); System.out.println(occurrence);
-
Использовать
string.split
String string = "a,b,c,d"; String []splitArray = string.split("\,"); System.out.println("Запятых тут : " + (splitArray.length - 1) + " штук.");
-
String testString = "a,b,c,d"; int occurrencesCount = testString.length() - testString.replace(",", "").length(); System.out.println(occurrencesCount);
-
Java8
String testString = "a,b,c,d"; long occurrencesCount = testString.chars().filter(ch -> ch == ',').count(); System.out.println(occurrencesCount);
-
Еще какой-нибудь способ
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
Алексей ШиманскийАлексей Шиманский
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 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, вы посоветовали бы изучить тем, кто готовится к собеседованию?