5807
Комментарий:
|
6512
|
Удаления помечены так. | Добавления помечены так. |
Строка 24: | Строка 24: |
* если данные готовы: `struct` | * если данные «бинарные» и заранее готовы: `struct` |
Строка 35: | Строка 35: |
* {i} То же, что и выше, но с помощью struct | * {i} То же, что и выше, но с помощью `struct` |
Строка 72: | Строка 72: |
Строка 80: | Строка 81: |
Строка 90: | Строка 92: |
* {*} идентификаторы | * {i} хеш для идентификаторов: * не все буквы * некоторые буквы встречаются чаще других (в случае Python, есть ещё «_») |
Строка 104: | Строка 108: |
Словарь — множество с атрибутами, т. е. соответствие множества хешируемых ключей множеству произвольных объектов | Словарь — множество с атрибутами, т. е. соответствие множества хешируемых ключей множеству произвольных объектов (он же «ассоциативный массив») |
Строка 108: | Строка 112: |
* ... * globals()/locals() |
* «именные перечни», в которых роль индекса играют строки * «разреженные матрицы» — словари с небольшим количеством элементов * с любыми числовыми индексами * с индексами-векторами типа `Arr[(10,20,0)]` * `globals()`/`locals()` |
Строка 113: | Строка 120: |
* {*} `collections` * {*} тестирование хеш-функции: много входных данных и гистограмма |
{{{#!highlight python3 counter = {} el = input() while el: counter[el] = counter.get(el,0) + 1 el = input() print(counter) }}} * `collections.defaultdict` и `collections.Counter` |
Работа с файлами. Множества. Словари
Работа с файлами
- Текстовые файлы
open(), read() / write() / close()
readlines(), он же сам файл, print(..., file=)
"b/t" — str или bytes
введение в with
вводить числа до 0, записывать в файл только положительные
- файлы с данными
если данные наши: сериализация/десериализация, pickle (json, xml, …)
dump[s]()/load[s]()
если данные «бинарные» и заранее готовы: struct
byte order
pack()/unpack()
Если в командной строке программы пять (с argv[0] — 6) параметров, то это:
- имя выходного файла
- имя,
- фамилия
- возраст (целое число
- средний балл (вещественное)
- .. тогда сериализовать эти данные в файл;
- а если параметр только один (argv[1]), это имя входного файла, десериализовать их оттуда и вывести
То же, что и выше, но с помощью struct
Словари и множества
- Задача хранения и индексирования
- сложных данных
- просто слишком больших данных
- +невосстановимое хеширование
- Свойства хеш-функции
- неоднозначность
- распределённость по ОЗ (на конкретных данных!)
- разброс для почти похожих
- невосстановимость объекта (сравнение без раскрытия)
- индексирование
- сортировка и поиск
a % b
int(sin(b)*1000)%100
hash(), какие объекты хешируются
- ...
если есть различные значения синуса, какой к ним хороший хеш?
1 # тестирование хеш-функции 2 3 import random 4 from math import * 5 6 def testhash(f, seq, N): 7 '''Применить числовую хеш-функцию f 8 ко всем элементам e последовательности seq 9 посчитать и вернуть список, сколько раз 10 f(e) == 0, 1, ... , N, где 0…N — ОЗ f() 11 ''' 12 hist = [0]*N 13 for e in seq: 14 hist[f(e)] += 1 15 return hist 16 17 def hash1(a): 18 return a%10 19 20 def hash2(a): 21 return int(sin(a)*1000)%10 22 23 PHI = (sqrt(5)-1)/2 24 PMAX = 10 25 26 def hash3(a): 27 return int(PMAX*(a*PHI%1)) 28 29 SEQSZ = 10000 30 31 #random.seed(100500) 32 seq = (random.randrange(10,100) for i in range(SEQSZ)) 33 hist = testhash(hash3, seq, 10) 34 print(hist,(max(hist)-min(hist))*100/SEQSZ)
хеш для идентификаторов:
- не все буквы
- некоторые буквы встречаются чаще других (в случае Python, есть ещё «_»)
- Задание, в т. ч. циклический конструктор
- Операции над множествами, методы
- Типичное использование
каких букв не хватает
вводятся предложения, проверить, есть ли общее слово (регистр букв игнорировать)
- Задание, в т. ч. циклический конструктор
- Операции над словарями, методы
- Типичное использование:
- «именные перечни», в которых роль индекса играют строки
- «разреженные матрицы» — словари с небольшим количеством элементов
- с любыми числовыми индексами
с индексами-векторами типа Arr[(10,20,0)]
globals()/locals()
- именные параметры функции
- Словари и счётчики
ручная реализация счётчика
collections.defaultdict и collections.Counter
генератор файла с N случайными словами (N задаётся из командной строки), причём 1-е слово встречается ровно 1 раз, второе — 2 раза, …, N-е — N раз
подсчёт слов в файле, гистограмма вида
######## word1 ############################# word2 ################### word3 ...
- ..где максимальная длина "#######" — 50 символов
самое популярное слово длиной >3 в файле anna.txt