Видеокурс выложен на сайте Altube.ru вместо Youtube и плеер Altube не поддерживает субтитры. Прошу решить вопрос о предоставлении русских субтитров в этом англоязычном видеокурсе. |
Кортежи (tuples)
20.4. Словари и кортежи
У словарей есть метод с названием "items", который возвращает список кортежей, где каждый кортеж – это пара ключ-значение3Версия Питона 3.0 в данном случае работает немного иначе.:
>>> d = {'a':10, 'b':1, 'c':22} >>> t = d.items() >>> print t [('a', 10), ('c', 22), ('b', 1)]
Как и следовало ожидать, в словаре элементы располагаются в произвольном порядке. Но, поскольку список кортежей является списком и кортежи можно сравнивать — можно сортировать список кортежей. Преобразование словаря в список кортежей – это способ вывода содержимого словаря, отсортированного по ключу:
>>> d = {'a':10, 'b':1, 'c':22} >>> t = d.items() >>> t [('a', 10), ('c', 22), ('b', 1)] >>> t.sort() >>> t [('a', 10), ('b', 1), ('c', 22)]
Новый список сортируется в алфавитном порядке по значению ключа.
20.5. Множественное присваивание при работе со словарями
Сочетая использование функции items, присваивание кортежей и цикл for, можно написать изящный фрагмент кода для перечисления ключей и их значений в словаре в одном цикле:
for key, val in d.items(): print val, key
В этом цикле используются две итерационные переменные, потому что функция items возвращает список кортежей; пара переменных key, val также образует кортеж, который пробегает все пары ключ/значение, содержащиеся в словаре.
После каждой итерации переменные key и val переходят к следующей паре ключ/значение, содержащейся в словаре (в порядке, задаваемой хеш-функцией).
0 a 2 c 1 b
Значения напечатаны в порядке, задаваемом хеш-функцией (т.е. без определенной упорядоченности).
Сочетая два указанных метода, мы можем вывести содержание словаря, которое отсортировано по значениям, содержащимся в парах ключ/значение.
Для этого сначала создается список кортежей, где каждый кортеж представляет собой пару (значение, ключ).Метод items даст нам список кортежей вида (ключ, значение), однако на этот раз мы хотим выполнить сортировку по значениям, а не по ключам.
Когда список кортежей (значение, ключ) создан, несложно отсортировать его в обратном порядке и напечатать новый отсортированный список.
>>> d = {'a':10, 'b':1, 'c':22} >>> l = list() >>> for key, val in d.items() : ... l.append( (val, key) ) ... >>> l [(10, 'a'), (22, 'c'), (1, 'b')] >>> l.sort(reverse=True) >>> l [(22, 'c'), (10, 'a'), (1, 'b')] >>>
Создав вручную список кортежей, в которых значение ключа является первым элементом, мы можем отсортировать список и получить содержимое словаря, отсортированное по значениям ключей.
20.6. Наиболее часто встречающиеся слова
Вернемся назад к нашему примеру – отрывку текста из произведения "Ромео и Джульетта", действие 2, сцена 2. Мы можем дополнить нашу программу, если применим технику вывода десяти наиболее распространенных в тексте слов, используя следующий код:
import string fhand = open('romeo-full.txt') counts = dict() for line in fhand: line = line.translate(None, string.punctuation) line = line.lower() words = line.split() for word in words: if word not in counts: counts[word] = 1 else: counts[word] += 1 # Sort the dictionary by value lst = list() for key, val in counts.items(): lst.append( (val, key) ) lst.sort(reverse=True) for key, val in lst[:10] : print key, val
Остается неизменной первая часть программы, которая читает файл и создает словарь, сопоставляющий каждому слову в документе количество его вхождений в текст. Но вместо обычного вывода количества вхождений и завершения программы мы создаем список кортежей (значение, ключ) и затем сортируем его в порядке убывания.
Поскольку значение ключа является первым элементом кортежа, оно будет использоваться первым для сравнения; если кортежей с подобным значением несколько, то будут сравниваться вторые элементы кортежей, т.е. ключи. Таким образом, кортежи с одинаковыми значениями будут сортироваться по ключам в алфавитном порядке.
В конце мы запишем изящный цикл for, который выполняет множественное присваивание в каждой итерации и выводит десять наиболее распространенных слов с помощью перебора части списка (lst[:10]).
Вывод наконец-то выглядит так, как это требуется для анализа частоты слов.
61 i 42 and 40 romeo 34 to 34 the 32 thou 32 juliet 30 that 29 my 24 thee
То, что эту непростую задачу разбора и анализа данных можно решить с помощью небольшой и понятной программы на Питоне из 19 строк, подтверждает, что Питон является очень удобным языком программирования в применении к задачам исследования информации.