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

Preview:

Citation preview

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

Python for Informatics: Exploring Informationwww.pythonlearn.com

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

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

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

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

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

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

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

$ 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

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

• Список

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

• Словарь

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

Словари

деньги

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

духи

конфеты

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

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

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

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

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

> Properties, Map или HashMap в Java

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

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

Словари

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

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

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

>>> 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}

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

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

>>> 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}

>>> 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

Список

Ключ

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

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

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

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

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

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

csev

zhen

zhen

marquard

zhen

cwen

csevmarquardzhen

marquard

csev

cwenzhen

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

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

csev

zhen

zhen

marquard

zhen

cwen

csevmarquardzhen

marquard

csev

cwenzhen

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

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

>>> 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}

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

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

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

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

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}

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

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

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

x = counts.get(name, 0)

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

Упрощенный подсчет с 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}

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()

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

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

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

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

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

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

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

Алгоритм подсчета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

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

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

Подсчет слов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/

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}

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

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

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

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

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

>>> 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)]>>>

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

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

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

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

>>> 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

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

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

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

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

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

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

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

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

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

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

Recommended