30
Словари в языке Python Глава 9 Python for Informatics: Exploring Information www.pythonlearn.com

Словари в языке Python - Wikimedia · Словари •Элементы списка индексируются по месту положения в списке •Словари

  • Upload
    others

  • View
    33

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Словари в языке Python - Wikimedia · Словари •Элементы списка индексируются по месту положения в списке •Словари

Словари в языке PythonГлава 9

Python for Informatics: Exploring Informationwww.pythonlearn.com

Page 2: Словари в языке Python - Wikimedia · Словари •Элементы списка индексируются по месту положения в списке •Словари

Что такое коллекция?

• Коллекция хороша тем, что в ней можно носить несколько значений в одной удобной упаковке.

• У нас имеется несколько значений в одной “переменной”

• Это делается за счет наличия нескольких мест “в” переменной

• Существуют способы нахождения различных мест в переменной

Page 3: Словари в языке Python - Wikimedia · Словари •Элементы списка индексируются по месту положения в списке •Словари

Что не является “коллекцией”

• Большинство из использованных нами переменных содержит одно значение. Если переменной присвоить новое значение, старое значение удаляется.

$ pythonPython 2.5.2 (r252:60911, Feb 22 2008, 07:57:53) [GCC 4.0.1 (Apple Computer, Inc. build 5363)] on darwin>>> x = 2>>> x = 4>>> print x4

Page 4: Словари в языке Python - Wikimedia · Словари •Элементы списка индексируются по месту положения в списке •Словари

Рассказ о двух коллекциях

• Список

> Линейная коллекция значений, которые остаются упорядоченными

• Словарь

> “Сумка” со значениями, каждое из которыхимеет свой ярлык

Page 5: Словари в языке Python - Wikimedia · Словари •Элементы списка индексируются по месту положения в списке •Словари

Словари

деньги

салфеткикалькулятор

духи

конфеты

http://en.wikipedia.org/wiki/Associative_array

Page 6: Словари в языке Python - Wikimedia · Словари •Элементы списка индексируются по месту положения в списке •Словари

Словари• Словари являются наиболее функциональными наборами данных в языке Python

• Словари в Python позволяют производить быстрые операции с данными

• В разных языка словари называются по-разному

> Ассоциативные массивы в Perl / PHP

> Properties, Map или HashMap в Java

> Контейнер свойств в C# / .Net

http://en.wikipedia.org/wiki/Associative_array

Page 7: Словари в языке Python - Wikimedia · Словари •Элементы списка индексируются по месту положения в списке •Словари

Словари

• Элементы списка индексируются по месту положения в списке

• Словари подобны сумке,так как данные в словаре не упорядочены

• Следовательно мы индексируем элементы словаря с помощью “ярлыков”

>>> purse = dict()>>> purse['money'] = 12>>> purse['candy'] = 3>>> purse['tissues'] = 75>>> print purse{'money': 12, 'tissues': 75, 'candy': 3}>>> print purse['candy']3>>> purse['candy'] = purse['candy'] + 2>>> print purse{'money': 12, 'tissues': 75, 'candy': 5}

Page 8: Словари в языке Python - Wikimedia · Словари •Элементы списка индексируются по месту положения в списке •Словари

Сравнение списков и словарей

• Словари схожи со списками за исключением того, что для поиска значений в словаре вместо чисел используются ключи

>>> lst = list()>>> lst.append(21)>>> lst.append(183)>>> print lst[21, 183]>>> lst[0] = 23>>> print lst[23, 183]

>>> ddd = dict()>>> ddd['age'] = 21>>> ddd['course'] = 182>>> print ddd{'course': 182, 'age': 21}>>> ddd['age'] = 23>>> print ddd{'course': 182, 'age': 23}

Page 9: Словари в языке Python - Wikimedia · Словари •Элементы списка индексируются по месту положения в списке •Словари

>>> lst = list()>>> lst.append(21)>>> lst.append(183)>>> print lst[21, 183]>>> lst[0] = 23>>> print lst[23, 183]

>>> ddd = dict()>>> ddd['age'] = 21>>> ddd['course'] = 182>>> print ddd{'course': 182, 'age': 21}>>> ddd['age'] = 23>>> print ddd{'course': 182, 'age': 23}

[0] 21

[1] 183lll

Ключ Значение

['course'] 183

['age'] 21ddd

Список

Ключ

СловарьЗначение

Page 10: Словари в языке Python - Wikimedia · Словари •Элементы списка индексируются по месту положения в списке •Словари

Литералы (константы) словаря• Литералы словаря записываются в фигурных скобках и содержат список пар в

виде ключ : значение

• Пустой словарь создается с помощью пустых фигурных скобок

>>> jjj = { 'chuck' : 1 , 'fred' : 42, 'jan': 100}>>> print jjj{'jan': 100, 'chuck': 1, 'fred': 42}>>> ooo = { }>>> print ooo{}>>>

Page 11: Словари в языке Python - Wikimedia · Словари •Элементы списка индексируются по месту положения в списке •Словари

Наиболее часто встречаемое имя?

csev

zhen

zhen

marquard

zhen

cwen

csevmarquardzhen

marquard

csev

cwenzhen

Page 12: Словари в языке Python - Wikimedia · Словари •Элементы списка индексируются по месту положения в списке •Словари

Наиболее часто встречаемое имя?

Page 13: Словари в языке Python - Wikimedia · Словари •Элементы списка индексируются по месту положения в списке •Словари

Наиболее часто встречаемое имя?

csev

zhen

zhen

marquard

zhen

cwen

csevmarquardzhen

marquard

csev

cwenzhen

Page 14: Словари в языке Python - Wikimedia · Словари •Элементы списка индексируются по месту положения в списке •Словари

Счетчики со словарями• Одним из примеров использования словаря является счетчик, выдающий, как часто встречается определенный объект

Ключ Значение

>>> ccc = dict()>>> ccc['csev'] = 1>>> ccc['cwen'] = 1>>> print ccc{'csev': 1, 'cwen': 1}>>> ccc['cwen'] = ccc['cwen'] + 1>>> print ccc{'csev': 1, 'cwen': 2}

Page 15: Словари в языке Python - Wikimedia · Словари •Элементы списка индексируются по месту положения в списке •Словари

Ошибки со словарями• Вы увидите ошибку при указании ключа, которого нет в словаре

• Чтобы проверить наличие в словаре определенного ключа, можно воспользоваться оператором in

>>> ccc = dict()>>> print ccc['csev']Traceback (most recent call last): File "<stdin>", line 1, in <module>KeyError: 'csev'>>> print 'csev' in cccFalse

Page 16: Словари в языке Python - Wikimedia · Словари •Элементы списка индексируются по месту положения в списке •Словари

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

counts = dict()names = ['csev', 'cwen', 'csev', 'zqian', 'cwen']for name in names : if name not in counts: counts[name] = 1 else : counts[name] = counts[name] + 1print counts

{'csev': 2, 'zqian': 1, 'cwen': 2}

Page 17: Словари в языке Python - Wikimedia · Словари •Элементы списка индексируются по месту положения в списке •Словари

Метод get для словарей

• Проверка наличия определенного ключа в словаре и при его отсутствии использование значения по умолчанию выполняется настолько часто, что для этого существует отдельный метод под названием get()

if name in counts: x = counts[name] else : x = 0

x = counts.get(name, 0)

Значение по умолчанию, если ключ отсутствует (и без ошибок). {'csev': 2, 'zqian': 1, 'cwen': 2}

Page 18: Словари в языке Python - Wikimedia · Словари •Элементы списка индексируются по месту положения в списке •Словари

Упрощенный подсчет с get()• Мы можем использовать get() и значение по умолчанию, равное нулю, при отсутствии ключа в словаре. Если ключ найден, мы добавляем к его счетчику один

counts = dict()names = ['csev', 'cwen', 'csev', 'zqian', 'cwen']for name in names : counts[name] = counts.get(name, 0) + 1print counts

Значение по умолчанию {'csev': 2, 'zqian': 1, 'cwen': 2}

Page 19: Словари в языке Python - Wikimedia · Словари •Элементы списка индексируются по месту положения в списке •Словари

http://www.youtube.com/watch?v=EHJ9uYx5L58

counts = dict()names = ['csev', 'cwen', 'csev', 'zqian', 'cwen']for name in names : counts[name] = counts.get(name, 0) + 1print counts

Упрощенный подсчет с get()

Page 20: Словари в языке Python - Wikimedia · Словари •Элементы списка индексируются по месту положения в списке •Словари

Написание программ (или программирование) является творческой работой, приносящей внутреннее удовлетворение. Программы можно писать по многим причинам, например, чтобы зарабатывать на жизнь, решить сложную проблему анализа данных, ради удовольствия или чтобы помочь кому-то решить определенную проблему.

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

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

так, чтобы постоянно задавать нам вопрос: “Над чем мне работать дальше?''

У нас есть быстрые компьютеры с огромным запасом памяти, которые могут быть очень полезными, если знать язык, на котором можно объяснить компьютеру, над чем работать дальше. Зная компьютерный язык, мы можем сказать

компьютеру выполнять за нас повторяющиеся действия. Интересно то, что работа, которую делают за нас компьютеры, зачастую кажется людям очень скучной.

Page 21: Словари в языке Python - Wikimedia · Словари •Элементы списка индексируются по месту положения в списке •Словари

the clown ran after the car and the car ran into the tent and the tent fell down on the clown and the car

Page 22: Словари в языке Python - Wikimedia · Словари •Элементы списка индексируются по месту положения в списке •Словари

Алгоритм подсчетаcounts = dict()print 'Enter a line of text:'line = raw_input('')

words = line.split()

print 'Words:', words

print 'Counting...'for word in words: counts[word] = counts.get(word,0) + 1print 'Counts', counts

Самым обычным алгоритмом подсчета слов в строке текста является разделение строки на слова и выполнение цикла по

словам. Каждое новое слово регистрируется в словаре.

Page 23: Словари в языке Python - Wikimedia · Словари •Элементы списка индексируются по месту положения в списке •Словари

Подсчет словpython wordcount.py Enter a line of text:the clown ran after the car and the car ran into the tent and the tent fell down on the clown and the car Words: ['the', 'clown', 'ran', 'after', 'the', 'car', 'and', 'the', 'car', 'ran', 'into', 'the', 'tent', 'and', 'the', 'tent', 'fell', 'down', 'on', 'the', 'clown', 'and', 'the', 'car']Counting…

Counts {'and': 3, 'on': 1, 'ran': 2, 'car': 3, 'into': 1, 'after': 1, 'clown': 2, 'down': 1, 'fell': 1, 'the': 7, 'tent': 2}

http://www.flickr.com/photos/71502646@N00/2526007974/

Page 24: Словари в языке Python - Wikimedia · Словари •Элементы списка индексируются по месту положения в списке •Словари

counts = dict()print 'Enter a line of text:'line = raw_input('')words = line.split()

print 'Words:', wordsprint 'Counting...’

for word in words: counts[word] = counts.get(word,0) + 1print 'Counts', counts

python wordcount.py Enter a line of text:the clown ran after the car and the car ran into the tent and the tent fell down on the clown and the car

Words: ['the', 'clown', 'ran', 'after', 'the', 'car', 'and', 'the', 'car', 'ran', 'into', 'the', 'tent', 'and', 'the', 'tent', 'fell', 'down', 'on', 'the', 'clown', 'and', 'the', 'car']Counting...

Counts {'and': 3, 'on': 1, 'ran': 2, 'car': 3, 'into': 1, 'after': 1, 'clown': 2, 'down': 1, 'fell': 1, 'the': 7, 'tent': 2}

Page 25: Словари в языке Python - Wikimedia · Словари •Элементы списка индексируются по месту положения в списке •Словари

Словари и определенные циклы

• Несмотря на то что значения словаря хранятся в неотсортированном порядке, мы можем написать цикл for, который проходит по всем элементам словаря. На самом деле цикл проходит по всем ключам словаря и выдает соответствующие значения.

>>> counts = { 'chuck' : 1 , 'fred' : 42, 'jan': 100}>>> for key in counts:... print key, counts[key]... jan 100chuck 1fred 42>>>

Page 26: Словари в языке Python - Wikimedia · Словари •Элементы списка индексируются по месту положения в списке •Словари

Получение списка ключей и значений

• Из словаря можно извлечь список ключей, значений или элементов (ключей и значений)

>>> jjj = { 'chuck' : 1 , 'fred' : 42, 'jan': 100}>>> print list(jjj)['jan', 'chuck', 'fred']>>> print jjj.keys()['jan', 'chuck', 'fred']>>> print jjj.values()[100, 1, 42]>>> print jjj.items()[('jan', 100), ('chuck', 1), ('fred', 42)]>>>

Что такое “кортеж”? Вы скоро узнаете...

Page 27: Словари в языке Python - Wikimedia · Словари •Элементы списка индексируются по месту положения в списке •Словари

Бонус: два итератора!

• Цикл проходит по парам словаря ключ-значение при помощи *двух* итераторов

• При каждом выполнении цикла первым итератором является ключ, а вторым - соответствующее ключу значение

>>> jjj = { 'chuck' : 1 , 'fred' : 42, 'jan': 100}>>> for aaa,bbb in jjj.items() :... print aaa, bbb... jan 100chuck 1fred 42>>>

[chuck] 1

[fred] 42

aaa bbb

[jan] 100

Page 28: Словари в языке Python - Wikimedia · Словари •Элементы списка индексируются по месту положения в списке •Словари

name = raw_input('Enter file:')handle = open(name, 'r')text = handle.read()words = text.split()

counts = dict()for word in words: counts[word] = counts.get(word,0) + 1

bigcount = Nonebigword = Nonefor word,count in counts.items(): if bigcount is None or count > bigcount: bigword = word bigcount = count

print bigword, bigcount

python words.py Enter file: clown.txt the 7

python words.py Enter file: words.txt to 16

Page 29: Словари в языке Python - Wikimedia · Словари •Элементы списка индексируются по месту положения в списке •Словари

Обзор• Что такое коллекция?• Списки по сравнению со словарями

• Константы словаря• Наиболее часто встречаемое слово

• Использование метода get()

• Хеширование и неотсортированность значений

• Написание циклов словаря• Краткое ознакомление: кортежи• Сортировка словарей

Page 30: Словари в языке Python - Wikimedia · Словари •Элементы списка индексируются по месту положения в списке •Словари

...Данная презентация охраняется авторским правом “Copyright 2010- Charles R. Severance (www.dr-chuck.com) University of Michigan School of Information” open.umich.edu и доступна на условиях лицензии 4.0 “С указанием авторства”. В соответствии с требованием лицензии “С указанием авторства" данный слайд должен присутствовать во всех копиях этого документа. При внесении каких-либо изменений в данный документ вы можете указать свое имя и организацию в список соавторов на этой странице для последующих публикаций.

Первоначальная разработка: Чарльз Северанс, Школа информации Мичиганского университета

Здесь впишите дополнительных авторов и переводчиков...

Благодарность / Содействие