# На лекции мы писали и выполняли этот код в PyCharm.
# В ipython3 notebook мы не сможем ничего подать на стандартный ввод.
# Для воспроизведения результата скопируйте фрагмент кода в отдельный файл и запустите его
import sys
# Читаем ввод построчно, печатаем длину каждой введенной строки
# Для завершения ввода надо ввести Ctrl+D в Linux, Ctrl+Z в Windows (End of file)
for line in sys.stdin:
line = line.rstrip() # Обрезаем завершающий перевод строки (и все пробельные символы)
print(len(line))
# Сортируем строки ввода
lines = []
for line in sys.stdin:
line = line.rstrip("\n") # Обрезаем только завершающий перевод строки
lines.append(line)
lines.sort()
for line in lines:
print(line)
# То же самое, но компактнее:
lines = sys.stdin.read().split("\n")
print("\n".join(sorted(lines)))
# Подсчет числа слов в тексте
words = {}
for line in sys.stdin:
line = line.strip()
for word in line.split(" "):
words[word] = words.get(word, 0) + 1
for word in words:
print(word, words[word])
# Пусть теперь слова надо отсортировать по убыванию частоты
words = {}
for line in sys.stdin:
line = line.strip()
for word in line.split(" "):
words[word] = words.get(word, 0) + 1
pairs = [(words[key], key) for key in words] # Список пар вида (частота, слово)
pairs.sort(reverse=True) # Сортируем пары по убыванию
for frequency, word in pairs:
print(word, frequency)
# Пусть теперь в текстовом файле нам поступают числа.
# Простая задача: в каждой строке вводится по одному целому числу, надо найти сумму
s = 0
for line in sys.stdin:
s += int(line)
print(s)
0
# Что если числа вводятся через пробел в одной строке?
numbers = input().split(" ")
numbers.sort()
print(" ".join(numbers))
# Здесь мы числа 1, 2, 3, 10 отсортируем неправильно (лексикографически)
1 2 3 10 1 10 2 3
# Для правильной сортировки надо строки превратить в числа
# Первый вариант
parts = input().split(" ")
for i in range(len(parts)):
parts[i] = int(parts[i])
parts.sort()
for number in parts:
print(number, end=" ")
1 2 10 3 14 1 2 3 10 14
# Второй вариант
parts = input().split(" ")
parts = list(map(int, parts))
parts.sort()
print(" ".join(map(str, parts)))
1 2 10 3 14 1 2 3 10 14
# Вот еще пример с map
import math
s = [1, 2, 3, 4, 5, 6, 7, 8]
print(list(map(math.sqrt, s)))
[1.0, 1.4142135623730951, 1.7320508075688772, 2.0, 2.23606797749979, 2.449489742783178, 2.6457513110645907, 2.8284271247461903]
# Функции
def factorial(n):
if n == 0:
return 1
return n * factorial(n - 1)
x = int(input())
print(factorial(x))
6 720
# Функции - такие же объекты, как и все остальное
# Например, можно сделать так:
g = factorial
print(g(6))
720
print(list(map(factorial, range(10))))
[1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880]
# Вернемся к задаче о подсчете числа слов
# Как отсортировать список пар (слово, частота) сразу по частоте?
words = {}
for line in sys.stdin:
line = line.strip()
for word in line.split(" "):
words[word] = words.get(word, 0) + 1
def rev(pair):
return pair[::-1]
pairs = list(words.items())
pairs.sort(reverse=True, key=rev) # key - функция получения "ключа" сортировки
# Если key задан, то при сортировке будут сравниваться не сами элементы, а их ключи
for word, freq in pairs:
print(word, freq)
# Функцию rev можно было бы определить прямо в месте использования как лямбда-функцию
words = {}
for line in sys.stdin:
line = line.strip()
for word in line.split(" "):
words[word] = words.get(word, 0) + 1
pairs = list(words.items())
pairs.sort(reverse=True, key=lambda pair: pair[::-1])
for word, freq in pairs:
print(word, freq)
# Еще примеры сортировок с ключом
s = [1, 4, -5, 2, 0, -3, 1, 18, -1]
s.sort(key=abs) # сортируем по модулю
print(s)
[0, 1, 1, -1, 2, -3, 4, -5, 18]
s = [1, 4, -5, 2, 0, -3, 1, 18, -1]
s.sort(key=lambda x: x * x) # сортируем по квадрату
print(s)
[0, 1, 1, -1, 2, -3, 4, -5, 18]
s = [1, 4, -5, 2, 0, -3, 1, 18, -1]
s.sort(key=lambda x: x if x > 0 else 0) # сортируем по хитрому ключу
print(s)
[-5, 0, -3, -1, 1, 1, 2, 4, 18]
# Ответ на вопрос: как с помощью lambda-функции зафиксировать аргумент?
def f(x, y):
return x + y
s = [1, 4, -5, 2, 0, -3, 1, 18, -1]
s = list(map(lambda x: f(x, 5), s)) # заменили каждый элемент x на f(x, 5) (то есть, x + 5)
print(s)
[6, 9, 0, 7, 5, 2, 6, 23, 4]