11 subscribers
38 photos
2 links
Download Telegram
4. Перебор элементов строки
На предыдущем уроке мы узнали, что цикл for можно использовать для перебора элементов множества. Таким же образом можно использовать цикл for, чтобы перебрать все буквы в слове:

text = 'hello, my dear friends!'
vowels = 0
for letter in text:
if letter in {'a', 'e', 'i', 'o', 'u', 'y'}:
vowels += 1
print(vowels)


Но, так как символы в строке пронумерованы, у нас есть еще один способ перебрать все элементы в строке: перебрать все индексы, используя уже знакомую нам конструкцию for i in range(...).

text = 'hello, my dear friends!'
vowels = 0
for i in range(len(text)):
if text[i] in 'aeiouy':
vowels += 1
print(vowels)
1. Работа со строками (повторение)
Рассмотрим еще одну задачу. Билет называют счастливым по-питерски, если сумма цифр его номера, стоящих на четных местах, равна сумме цифр, стоящих на нечетных местах. Нам необходимо написать программу, которая определяет, является ли билет счастливым по-питерски.

Если рассматривать номер билета как строку из цифр, задача сводится к подсчету суммы цифр, стоящих на позициях 0, 2, 4..., и суммы цифр, стоящих на позициях 1, 3, 5... Чтобы перебрать элементы, мы можем воспользоваться конструкцией for i in range(...), указав шаг 2. Тогда соответствующий фрагмент программы может выглядеть следующим образом:

number = input()
odd = even = 0
for i in range(0, len(number), 2):
odd += int(number[i])
for i in range(1, len(number), 2):
even += int(number[i])
if odd == even:
print('Счастливый по-питерски!')

Можно так же записать с помощью одного цикла:

number = input()
odd = even = 0

for i, digit in enumerate(number):
if i % 2 == 0: # Индекс чётный, цифра нечётная по условию задачи
odd += int(digit)
else: # Индекс нечётный, цифра чётная
even += int(digit)

if odd == even:
print('Счастливый по-питерски!')
Для того, чтобы создать пустой список, можно воспользоваться конструкцией [] или функцией list.

empt1 = [] # это пустой список
empt2 = list() # и это тоже пустой список
Добавление элемента в список
Добавление элемента в конец списка делается при помощи метода append (этот метод аналогичен методу add, используемому для добавления элементов в множество):

primes.append(13)
primes.append(15) # ой, ошиблись — 15 составное число!
Python
Добавление элемента в список Добавление элемента в конец списка делается при помощи метода append (этот метод аналогичен методу add, используемому для добавления элементов в множество): primes.append(13) primes.append(15) # ой, ошиблись — 15 составное число!
можно добавлять по одному элементу за раз к концу списка, для более чем одного используется метод extend
Кроме того, вы можете расширить имеющийся список любым итерабельным (перечисляемым) объектом с помощью метода extend:
my_list = [1, 2, 3]
another_list = [4, 5, 6]
my_list.extend(another_list)
print(my_list)
[1, 2, 3, 4, 5, 6]
s = input()
n = len(s)
mid = n//2
if n % 2 == 0:
mid -= 1
l1 = mid - 1
r = mid+1
if n % 2==0:
r += 1
print( ' ' * (l1+1), s[l1+1:r], sep='')
while l1 >= 0:
print(' ' * (l1), s[l1], ' ' * (r-l1-1), s[r], sep='')
СОРТИРОВКА ПРИ ПОМОЩИ "ПУЗЫРЯ"
list1 = [3, 4, 1, 8, 0]  # Исходный список
n = len(list1) # Определяем длину списка

for i in range(n): # Внешний цикл: выполняется n раз (по числу элементов в списке)
for j in range(1, n - i): # Внутренний цикл: проходит по неотсортированной части списка
if list1[j - 1] > list1[j]: # Если текущий элемент больше следующего:
list1[j - 1], list1[j] = list1[j], list1[j - 1] # Меняем их местами

print(list1) # Выводим отсортированный список


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

---

### Исходный список:
`list1 = [3, 4, 1, 8, 0]`
`n = 5` (длина списка)

---

### **Внешний цикл `i=0` (первый проход):**
- Количество итераций внутреннего цикла: `range(1, n - i)` → `range(1, 5)` (проход по индексам `j=1, 2, 3, 4`).

#### Внутренний цикл:
1. **Итерация `j=1`:**
- Сравниваем: `list1[j-1] = list1[0] = 3` и `list1[j] = list1[1] = 4`.
- Условие: `3 > 4` — **ложь**, обмена нет.
- Список: `[3, 4, 1, 8, 0]`.

2. **Итерация `j=2`:**
- Сравниваем: `list1[j-1] = list1[1] = 4` и `list1[j] = list1[2] = 1`.
- Условие: `4 > 1` — **истина**, меняем местами.
- Список: `[3, 1, 4, 8, 0]`.

3. **Итерация `j=3`:**
- Сравниваем: `list1[j-1] = list1[2] = 4` и `list1[j] = list1[3] = 8`.
- Условие: `4 > 8` — **ложь**, обмена нет.
- Список: `[3, 1, 4, 8, 0]`.

4. **Итерация `j=4`:**
- Сравниваем: `list1[j-1] = list1[3] = 8` и `list1[j] = list1[4] = 0`.
- Условие: `8 > 0` — **истина**, меняем местами.
- Список: `[3, 1, 4, 0, 8]`.

---

### **Внешний цикл `i=1` (второй проход):**
- Количество итераций внутреннего цикла: `range(1, n - i)` → `range(1, 4)` (проход по индексам `j=1, 2, 3`).

#### Внутренний цикл:
1. **Итерация `j=1`:**
- Сравниваем: `list1[j-1] = list1[0] = 3` и `list1[j] = list1[1] = 1`.
- Условие: `3 > 1` — **истина**, меняем местами.
- Список: `[1, 3, 4, 0, 8]`.

2. **Итерация `j=2`:**
- Сравниваем: `list1[j-1] = list1[1] = 3` и `list1[j] = list1[2] = 4`.
- Условие: `3 > 4` — **ложь**, обмена нет.
- Список: `[1, 3, 4, 0, 8]`.

3. **Итерация `j=3`:**
- Сравниваем: `list1[j-1] = list1[2] = 4` и `list1[j] = list1[3] = 0`.
- Условие: `4 > 0` — **истина**, меняем местами.
- Список: `[1, 3, 0, 4, 8]`.

---

### **Внешний цикл `i=2` (третий проход):**
- Количество итераций внутреннего цикла: `range(1, n - i)` → `range(1, 3)` (проход по индексам `j=1, 2`).

#### Внутренний цикл:
1. **Итерация `j=1`:**
- Сравниваем: `list1[j-1] = list1[0] = 1` и `list1[j] = list1[1] = 3`.
- Условие: `1 > 3` — **ложь**, обмена нет.
- Список: `[1, 3, 0, 4, 8]`.

2. **Итерация `j=2`:**
- Сравниваем: `list1[j-1] = list1[1] = 3` и `list1[j] = list1[2] = 0`.
- Условие: `3 > 0` — **истина**, меняем местами.
- Список: `[1, 0, 3, 4, 8]`.

---

### **Внешний цикл `i=3` (четвертый проход):**
- Количество итераций внутреннего цикла: `range(1, n - i)` → `range(1, 2)` (проход по индексу `j=1`).

#### Внутренний цикл:
1. **Итерация `j=1`:**
- Сравниваем: `list1[j-1] = list1[0] = 1` и `list1[j] = list1[1] = 0`.
- Условие: `1 > 0` — **истина**, меняем местами.
- Список: `[0, 1, 3, 4, 8]`.

---

### **Внешний цикл `i=4` (пятый проход):**
- Внутренний цикл не выполняется, так как `n - i = 1`.

---

### Итог:
Список отсортирован: `[0, 1, 3, 4, 8]`.
list1 = [3, 4, 1, 8, 0]
n = len(list1)
for i in range(n):
for j in range(1, n - i):
if list1[j - 1] > list1[j]:
list1[j - 1], list1[j] = list1[j], list1[j - 1]
print(list1)

#BubbleSort
Что такое списковые включения?
Списковое включение — это способ компактно и удобно создавать списки, выполняя цикл прямо внутри квадратных скобок.

Примеры использования
1. Простая трансформация списка
numbers = [1, 2, 3, 4, 5]
squared = [x ** 2 for x in numbers]
print(squared) # Вывод: [1, 4, 9, 16, 25]

5. Сложные выражения
Списковые включения поддерживают любые выражения:
numbers = [1, 2, 3, 4]
results = [x ** 2 if x % 2 == 0 else x ** 3 for x in numbers]
print(results) # Вывод: [1, 4, 27, 16]

Что нельзя делать в списковых включениях
Сложные конструкции, которые ухудшают читаемость
Если включение становится слишком громоздким, лучше использовать обычный цикл:
# Не стоит делать так
result = [x ** 2 if x > 0 else -x for x in range(-10, 10) if x != 0]

#Вместо этого:
result = []
for x in range(-10, 10):
if x != 0:
result.append(x ** 2 if x > 0 else -x)
Кортежи:
Кортежи

Кортежи очень похожи на списки, они тоже являются индексированной коллекцией, только вместо квадратных в них используются круглые скобки (причем их часто можно пропускать):


# кортеж из двух элементов; тип элементов может быть любой
card = ('7', 'spades')

# пустой кортеж (из 0 элементов)
empty = ()

# кортеж из 1 элемента - запятая нужна, чтобы отличить от обычных скобок
t = (18,)

# длина, значение отдельного элемента, сложение - как у списков
print(len(card), card[0], card + t)
Кортежи можно сравнивать между собой:
(1, 2) == (1, 3)    # False
(1, 2) < (1, 3) # True
(1, 2) < (5,) # True
('7', 'clubs') > ('7', 'hearts') # False

# А вот так сравнивать нельзя: элементы кортежей разных типов
(1, 2) < ('7', 'spades')
Неизменяемость

Важнейшее техническое отличие кортежей от списков — неизменяемость. Как и к строке, к кортежу нельзя добавить элемент методом append, а существующий элемент нельзя изменить, обратившись к нему по индексу. Это выглядит недостатком, но в дальнейшем мы поймем, что у кортежей есть и преимущества.