#!/usr/bin/env python # coding: utf-8 # In[1]: # На лекции мы писали и выполняли этот код в PyCharm. # В ipython3 notebook мы не сможем ничего подать на стандартный ввод. # Для воспроизведения результата скопируйте фрагмент кода в отдельный файл и запустите его # In[4]: import sys # In[8]: # Читаем ввод построчно, печатаем длину каждой введенной строки # Для завершения ввода надо ввести Ctrl+D в Linux, Ctrl+Z в Windows (End of file) for line in sys.stdin: line = line.rstrip() # Обрезаем завершающий перевод строки (и все пробельные символы) print(len(line)) # In[7]: # Сортируем строки ввода lines = [] for line in sys.stdin: line = line.rstrip("\n") # Обрезаем только завершающий перевод строки lines.append(line) lines.sort() for line in lines: print(line) # In[6]: # То же самое, но компактнее: lines = sys.stdin.read().split("\n") print("\n".join(sorted(lines))) # In[9]: # Подсчет числа слов в тексте 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]) # In[11]: # Пусть теперь слова надо отсортировать по убыванию частоты 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) # In[13]: # Пусть теперь в текстовом файле нам поступают числа. # Простая задача: в каждой строке вводится по одному целому числу, надо найти сумму s = 0 for line in sys.stdin: s += int(line) print(s) # In[16]: # Что если числа вводятся через пробел в одной строке? numbers = input().split(" ") numbers.sort() print(" ".join(numbers)) # Здесь мы числа 1, 2, 3, 10 отсортируем неправильно (лексикографически) # In[18]: # Для правильной сортировки надо строки превратить в числа # Первый вариант parts = input().split(" ") for i in range(len(parts)): parts[i] = int(parts[i]) parts.sort() for number in parts: print(number, end=" ") # In[19]: # Второй вариант parts = input().split(" ") parts = list(map(int, parts)) parts.sort() print(" ".join(map(str, parts))) # In[21]: # Вот еще пример с map import math s = [1, 2, 3, 4, 5, 6, 7, 8] print(list(map(math.sqrt, s))) # In[24]: # Функции def factorial(n): if n == 0: return 1 return n * factorial(n - 1) x = int(input()) print(factorial(x)) # In[25]: # Функции - такие же объекты, как и все остальное # Например, можно сделать так: g = factorial print(g(6)) # In[26]: print(list(map(factorial, range(10)))) # In[32]: # Вернемся к задаче о подсчете числа слов # Как отсортировать список пар (слово, частота) сразу по частоте? 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) # In[33]: # Функцию 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) # In[35]: # Еще примеры сортировок с ключом s = [1, 4, -5, 2, 0, -3, 1, 18, -1] s.sort(key=abs) # сортируем по модулю print(s) # In[36]: s = [1, 4, -5, 2, 0, -3, 1, 18, -1] s.sort(key=lambda x: x * x) # сортируем по квадрату print(s) # In[37]: s = [1, 4, -5, 2, 0, -3, 1, 18, -1] s.sort(key=lambda x: x if x > 0 else 0) # сортируем по хитрому ключу print(s) # In[39]: # Ответ на вопрос: как с помощью 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) # In[ ]: