Перейти к содержимому

Как проверить есть ли ключ в словаре python

  • автор:

Как проверить: является ли строка частью ключа словаря в Python

Пользователь x3al направил на правильный путь написания скрипта замены английскийских субтитров на русские. Переделанный скрипт примерно такой:

#!/usr/bin/env python3 # -*- coding: utf-8 -*- # Создаем словать en2rus = <> # Открываем файл c переводами with open("txt") as f: # Если открывается try: # Обрабаываем в цикле while True: # Первая строка FirstLine = next(f) # Вторая строка SecondLine = next(f) # Заносим первую строку как ключ в словарь, а вторую строку как значение в # словарь # можно заодно любую длину сюда закинуть en2rus[FirstLine] = SecondLine # Обрабатываем ошибку except StopIteration: pass # файл кончился print(en2rus, "- Словарь") with open("srt") as b, open("srt-out", "w") as out: for SrtLine in b: print(SrtLine) print(dict.keys(en2rus)) if SrtLine in list(en2rus): print(SrtLine, "- SrtLine") 

Собственно английское предложение заносится как ключ в словарь, а русский перевод заносится как значание в словарь. И теперь надо проверить совпадает/входит ли пара-тройка английских слов в ключ словаря.

Пробовал dict.keys и list(dict). Не получается. Как лучше реализовать?

chemtech ★
19.02.15 19:17:53 MSK
1 2 →

Только перебором ключей вроде:

for key in dictionary: if type(key) is str and s in key: . 

proud_anon ★★★★★
( 19.02.15 19:25:50 MSK )
Ответ на: комментарий от proud_anon 19.02.15 19:25:50 MSK

Опять у меня вложение 4-й степени:

with open("srt") as b, open("srt-out", "w") as out: for SrtLine in b: for key in en2rus: if SrtLine in key: print("Есть такая строка в ключе") 

chemtech ★
( 19.02.15 19:31:50 MSK ) автор топика
Ответ на: комментарий от proud_anon 19.02.15 19:25:50 MSK

Почему- то берет последнее значение:

with open("srt") as b, open("srt-out", "w") as out: for SrtLine in b: for key in en2rus: if SrtLine in key: print(SrtLine) 
call queuing feature. 

Хотя в файле srt вот что:

1 00:00:00,239 --> 00:00:03,280 Like most modern PBXs Asterisk supports a call queuing feature. 

chemtech ★
( 19.02.15 19:48:01 MSK ) автор топика
Ответ на: комментарий от chemtech 19.02.15 19:48:01 MSK

Может, в словаре нет ключа, содержащего строку «Like most modern PBXs Asterisk supports a »?

proud_anon ★★★★★
( 19.02.15 19:59:00 MSK )
Ответ на: комментарий от proud_anon 19.02.15 19:59:00 MSK

with open("srt") as b, open("srt-out", "w") as out: for SrtLine in b: print(SrtLine,"for SrtLine in b:") for key in en2rus: print(SrtLine,"for key in en2rus:") if SrtLine in key: print(key) print(SrtLine,"if SrtLine in key:") 
Like most modern PBXs Asterisk supports a for SrtLine in b: Like most modern PBXs Asterisk supports a for key in en2rus: call queuing feature. for SrtLine in b: call queuing feature. for key in en2rus: Like most modern PBXs Asterisk supports a call queuing feature. call queuing feature. if SrtLine in key: 

Т.е. «for key in en2rus:» часть фразы видит, но почему дальше не идет.

chemtech ★
( 19.02.15 20:07:22 MSK ) автор топика

Python славится батарейками: для ооочень многих случаев уже есть либо функции в стандартной библиотеке, либо какая-то отдельная.

>>> import pysrt >>> a = pysrt.open("1.srt") >>> a[1].start SubRipTime(0, 4, 27, 929) >>> a[1].end SubRipTime(0, 4, 29, 897) >>> a[1].text u'Code red.\nCode red.' 

Соответствующий кусок srt файла:

2 00:04:27,929 --> 00:04:29,897 Code red. Code red. 

i-rinat ★★★★★
( 19.02.15 20:10:47 MSK )
Ответ на: комментарий от chemtech 19.02.15 20:07:22 MSK

 print(SrtLine,"for SrtLine in b:") for key in en2rus: print(SrtLine,"for key in en2rus:")

Во второй раз лучше было печатать key.

Однако всё понятно. У тебя проблема с переносами строк. Он ищет «Like most modern PBXs Asterisk supports a \n» и «call queuing feature.\n». Второе есть, первого — нет.

При чтении файла построчно конец строки не выкидывается автоматически.

proud_anon ★★★★★
( 19.02.15 20:16:27 MSK )
Ответ на: комментарий от proud_anon 19.02.15 20:16:27 MSK

Аа.. А есть батарейка чтобы не было переноса строки? Или надо обрабатывать/убирать вручную «\n» ? Спасибо

chemtech ★
( 19.02.15 20:19:28 MSK ) автор топика
Ответ на: комментарий от i-rinat 19.02.15 20:10:47 MSK

А как узнать какие методы есть у модуля pysrt? Или как правильно сформулировать вопрос. В гугле искал «как узнать какие методы есть у модуля python»

chemtech ★
( 19.02.15 20:22:11 MSK ) автор топика
Ответ на: комментарий от chemtech 19.02.15 20:19:28 MSK

my_string.rstrip('\r\n')

Хотя в принципе можно и

my_string.rstrip('\n')

потому что Python конвертирует \r\n в \n.

proud_anon ★★★★★
( 19.02.15 20:24:50 MSK )
Последнее исправление: proud_anon 19.02.15 20:25:20 MSK (всего исправлений: 1)

И теперь надо проверить совпадает/входит ли пара-тройка английских слов в ключ словаря.

zolden ★★★★★
( 19.02.15 20:26:25 MSK )
Ответ на: комментарий от zolden 19.02.15 20:26:25 MSK

А как еще перевести текст в субтитрах?

chemtech ★
( 19.02.15 20:27:49 MSK ) автор топика
Ответ на: комментарий от proud_anon 19.02.15 20:24:50 MSK

with open("srt") as b, open("srt-out", "w") as out: for Line in b: SrtLine=Line.rstrip('\n') # print(SrtLine, "for SrtLine in b:") for key in en2rus: # print(SrtLine, "for key in en2rus:") if SrtLine in key: print(SrtLine) 

chemtech ★
( 19.02.15 20:40:35 MSK ) автор топика

кстати первый словарь en2rus наверно проще так заполнять:

with open('txt') as f: en2rus =

zolden ★★★★★
( 19.02.15 20:47:38 MSK )
Ответ на: комментарий от i-rinat 19.02.15 20:10:47 MSK

Python славится батарейками: для ооочень многих случаев

Это уже не первый тред ТСа на эту тему, там не только костыль на костыле, там вся задача в адаптации инвалидного кресла к стоячему положению.

proud_anon ★★★★★
( 19.02.15 20:52:02 MSK )
Ответ на: комментарий от chemtech 19.02.15 20:22:11 MSK

А как узнать какие методы есть у модуля pysrt?

В документации надо смотреть. Я просто в исходники глянул, увидел определение open. А потом попробовал открыть файл и посмотреть, что он мне выдаст.

i-rinat ★★★★★
( 19.02.15 20:55:21 MSK )
Ответ на: комментарий от proud_anon 19.02.15 20:52:02 MSK

Постепенно переходим с костылей на инвалидную каляску. Она на колесах 🙂

chemtech ★
( 19.02.15 21:05:40 MSK ) автор топика
Ответ на: комментарий от zolden 19.02.15 20:47:38 MSK

В коде выше есть StopIteration для моментов когда файл закончится. А так да, ваш код меньше

chemtech ★
( 19.02.15 21:08:10 MSK ) автор топика
Ответ на: комментарий от chemtech 19.02.15 21:08:10 MSK

В коде выше есть StopIteration для моментов когда файл закончится

zolden ★★★★★
( 19.02.15 21:20:25 MSK )
Ответ на: комментарий от zolden 19.02.15 20:47:38 MSK
chemtech ★
( 19.02.15 21:20:44 MSK ) автор топика
Ответ на: комментарий от proud_anon 19.02.15 20:24:50 MSK

А еще вопрос. Говорит не может заменить текст:

with open("srt") as b, open("srt-out", "w") as out: for Line in b: SrtLine=Line.rstrip('\r\n') . out=b.replace(SrtLine,y[0]) out.write 
 out=b.replace(SrtLine,y[0]) AttributeError: '_io.TextIOWrapper' object has no attribute 'replace' 

chemtech ★
( 19.02.15 21:23:48 MSK ) автор топика
Ответ на: комментарий от proud_anon 19.02.15 19:25:50 MSK

Правильнее проверять принадлежность к типу так:

if isinstance(key, str): . 

vertinsky
( 19.02.15 21:24:06 MSK )
Ответ на: комментарий от proud_anon 19.02.15 20:24:50 MSK

Можно еще вопрос. Говорит не может заменить текст:

with open("srt") as b, open("srt-out", "w") as out: for Line in b: SrtLine=Line.rstrip('\r\n') . out=b.replace(SrtLine,y[0]) out.write 
 out=b.replace(SrtLine,y[0]) AttributeError: '_io.TextIOWrapper' object has no attribute 'replace' 

chemtech ★
( 19.02.15 21:33:52 MSK ) автор топика
Ответ на: комментарий от vertinsky 19.02.15 21:24:06 MSK

Правильнее проверять принадлежность к типу так:

Да, правильно. Всё время что-нибудь новое про Питон узнаю. Обычно ведь используется утиная типизация без проверки типа, так что, наверное, тип лучше вообще не проверять.

proud_anon ★★★★★
( 19.02.15 21:43:12 MSK )
Последнее исправление: proud_anon 19.02.15 21:44:04 MSK (всего исправлений: 1)

Ответ на: комментарий от chemtech 19.02.15 21:33:52 MSK

Вот в этом коде:

out=b.replace(SrtLine,y[0]) out.write

Что ты вообще хотел сделать?

proud_anon ★★★★★
( 19.02.15 21:46:18 MSK )
Последнее исправление: proud_anon 19.02.15 21:46:37 MSK (всего исправлений: 1)

Ответ на: комментарий от proud_anon 19.02.15 21:46:18 MSK

Хотел заменить строку SrtLine — это совпадающая строка из файла srt на строку y[0] — это русский перевод примерно той же длины.

out — это файл, открытый на запись. а b — это файл srt

chemtech ★
( 19.02.15 22:00:23 MSK ) автор топика
Ответ на: комментарий от proud_anon 19.02.15 21:46:18 MSK

Вот еще раз код:

#!/usr/bin/env python3 # -*- coding: utf-8 -*- import textwrap import string with open('txt') as f: en2rus = with open("srt") as b, open("srt-out", "w") as out: for Line in b: SrtLine=Line.rstrip('\r\n') for key in en2rus: if SrtLine in key: Divide_SrtLine_by_LenFirstLine = round(len(SrtLine) / Lenkey, 2) print(Divide_SrtLine_by_LenFirstLine, "=", "длина:", SrtLine, "/", "длина:", key) ChooseBlockFromSecondLine = round(Divide_SrtLine_by_LenFirstLine * Lenkey) print(ChooseBlockFromSecondLine, "= ( длина:", SrtLine, "/ длина:", key, ") * длина:", len(en2rus[key])) y=textwrap.wrap(en2rus[key], width=ChooseBlockFromSecondLine) print(y[0]) out=b.replace(SrtLine,y[0],1) out.write 

chemtech ★
( 19.02.15 22:03:27 MSK ) автор топика
Ответ на: комментарий от proud_anon 19.02.15 21:46:18 MSK

Вот эти переменные

SrtLine - "Like most modern PBXs Asterisk supports a " ------------------------------------------------------------ y[0] - "Как и большинство современных АТС Asterisk" 

chemtech ★
( 19.02.15 22:07:39 MSK ) автор топика
Ответ на: комментарий от chemtech 19.02.15 22:00:23 MSK

Нельзя в файле таким образом заменить строку. Надо выводить переводы в файл out.

proud_anon ★★★★★
( 19.02.15 22:34:27 MSK )
Ответ на: комментарий от chemtech 19.02.15 20:22:11 MSK

А как узнать какие методы есть у модуля

dir(модуль) ? есть ещё help(), ну и если все сделано праильно, то метод.__doc__ покажет что этот метод делает

Dred ★★★★★
( 20.02.15 00:25:13 MSK )
Ответ на: комментарий от proud_anon 19.02.15 22:34:27 MSK

Переделал немного скрипт. Но еще есть ошибки. Пример. Вот есть вот такой файл srt:

1 00:00:12,753 --> 00:00:14,762 Agreed. What's your point? 2 00:00:14,950 --> 00:00:18,140 There's no point, I just think it's a good idea for a T-shirt. 

Вот что получается:

1 00:00:12,753 --> 00:00:14,762 Согласе смысл? 2 00:00:14,950 --> 00:00:18,140 Нет смысла, я всего лишь подумал, это хорошая идея для 

Сам скрипт

#!/usr/bin/env python3 # -*- coding: utf-8 -*- import textwrap # Создаем словать en2rus = <> # Открываем файл c переводами with open("txt") as f: # Если открывается try: # Обрабаываем в цикле while True: # Первая строка FirstLine = next(f) # Вторая строка SecondLine = next(f) # Заносим первую строку как ключ в словарь, а вторую строку как значение в # словарь # можно заодно любую длину сюда закинуть en2rus[FirstLine] = SecondLine # print(en2rus) # Обрабатываем ошибку except StopIteration: pass # файл кончился # Открываем файл c переводами with open("srt") as b, open("srt-out", "w") as out: # Если открывается try: # Обрабаываем в цикле while True: # Первая строка FirstLine = next(b) # Номер блока субтитров. Просто записываем out.write(FirstLine) # Вторая строка. Время субтитра. Просто записываем SecondLine = next(b) out.write(SecondLine) # Третья строка ThirdLine = next(b) # Убираем знак завершения строки SrtLine = ThirdLine.rstrip('\r\n') # Перебираем все ключи словаря for key in en2rus: # Проверяем входит ли строка в ключи словаря - ключи словаря английский текст if SrtLine in key: # Определяем длину ключа Lenkey = len(key) # Определяем длину строки LenSrtLine = len(SrtLine) # Определяем длину переведенной строки, от которой нужно отрезать текст y = textwrap.wrap(en2rus[key], width=LenSrtLine) # Заменяем английский текст на перевод ReplaceLine = ThirdLine.replace(SrtLine, y[0]) # Записываем замененный текст out.write(ReplaceLine) # Четвертая строка FourthLine = next(b) # Убираем знак завершения строки SrtLine = FourthLine.rstrip('\r\n') # Если длина строки = 2, тогда просто записываем if len(SrtLine) == 2: out.write(FourthLine) else: # Иначе: # Перебираем все ключи словаря for key in en2rus: # Проверяем входит ли строка в ключи словаря - ключи словаря английский текст if SrtLine in key: # Определяем длину ключа Lenkey = len(key) # Определяем длину строки LenFourthLine = len(SrtLine) # Определяем длину переведенной строки, от которой нужно отрезать текст y = textwrap.wrap(en2rus[key], width=LenSrtLine) # Заменяем английский текст на перевод ReplaceLine = FourthLine.replace(SrtLine, y[1]) # Записываем замененный текст out.write(ReplaceLine) # Обрабатываем ошибку except StopIteration: pass # файл кончился 

chemtech ★
( 20.02.15 19:20:21 MSK ) автор топика
Ответ на: комментарий от chemtech 20.02.15 19:20:21 MSK

Какой страшный код у тебя.

except StopIteration: pass # файл кончился

Вот это самое страшное место.

А что касается твоей проблемы, то, КМК, что ты написал, то ты и получил:

for key in en2rus: # Проверяем входит ли строка в ключи словаря - ключи словаря английский текст if SrtLine in key: # Определяем длину ключа Lenkey = len(key) # Определяем длину строки LenSrtLine = len(SrtLine) # Определяем длину переведенной строки, от которой нужно отрезать текст y = textwrap.wrap(en2rus[key], width=LenSrtLine) # Заменяем английский текст на перевод ReplaceLine = ThirdLine.replace(SrtLine, y[0]) # Записываем замененный текст out.write(ReplaceLine)

Ты отрезаешь от русской строки LenSrtLine символов, где LenSrtLine = длина оригинальной английской строки. Например, строка «Agreed.» превращается в «Согласе».

В качестве исправления на скорую руку могу предложить следующее:

# Определяем длину переведенной строки, от которой нужно отрезать текст replacement = re.match('^.>>\w*\W?'.format(LenSrtLine), en2rus[key]) # Заменяем английский текст на перевод ReplaceLine = SrtLine.replace(SrtLine, replacement)

Кроме того, вот тут:

#В последнем else y = textwrap.wrap(en2rus[key], width=LenSrtLine)

у тебя опечатка, надо было LenFourthLine.

Конечно, правильнее всего было изначально разбивать по словам, а не по символам.

proud_anon ★★★★★
( 20.02.15 19:51:05 MSK )
Последнее исправление: proud_anon 20.02.15 19:54:28 MSK (всего исправлений: 1)

Ответ на: комментарий от proud_anon 20.02.15 19:51:05 MSK

Добрый день. Я знаю, что код страшный. У меня нет ни учителя, ни кого-то другого, где можно спросить. Спросить самое быстрое могу в интернете. Курсов по Python у нас в городе нет. А что такое КМК?

chemtech ★
( 20.02.15 19:54:58 MSK ) автор топика
Ответ на: комментарий от proud_anon 20.02.15 19:51:05 MSK

Спасибо за ответ. По поводу «у тебя опечатка, надо было LenFourthLine.»

Я уже пробовал -получаю вот такую ошибку.

 ReplaceLine = FourthLine.replace(SrtLine, y[1]) IndexError: list index out of range 

Попробую использовать ваш совет. Спасибо.

chemtech ★
( 20.02.15 19:59:21 MSK ) автор топика

Как проверить: является ли строка частью ключа словаря в Python

needkeys = [x for x in kv.keys() if needstr in x]

то, что ниже — не понял вообще, только испугался

buratino ★★★★★
( 20.02.15 20:00:07 MSK )
Ответ на: комментарий от proud_anon 20.02.15 19:51:05 MSK

# Определяем длину переведенной строки, от которой нужно отрезать текст replacement = re.match('^.>>\w*\W?'.format(LenSrtLine), en2rus[key]) # Заменяем английский текст на перевод ReplaceLine = SrtLine.replace(SrtLine, replacement) 

Получаю вот такую ошибку:

 ReplaceLine = SrtLine.replace(SrtLine, replacement) TypeError: Can't convert '_sre.SRE_Match' object to str implicitly 

chemtech ★
( 20.02.15 20:02:34 MSK ) автор топика
Ответ на: комментарий от buratino 20.02.15 20:00:07 MSK

ps. чувак, это не python. ты пишешь на каком-то то ли паскале, то ли ещё чём-то, но в python-синтаксисе. ты не пишешь на python-е. писать на python-е *против рожна* очень больно.

полистай pep-8 и pep-20. поставь flake8 и считай даже самый рабочий код неверным, пока есть хоть один warning. не знаю, насколько это поможет, но то, что ты делаешь — это ужасно.

buratino ★★★★★
( 20.02.15 20:03:16 MSK )
Ответ на: комментарий от buratino 20.02.15 20:03:16 MSK

Меня никто не учил. Учусь как могу.

chemtech ★
( 20.02.15 20:04:01 MSK ) автор топика
Ответ на: комментарий от chemtech 20.02.15 19:54:58 MSK

У меня нет ни учителя, ни кого-то другого, где можно спросить.

Проблема в том, что вопросы у тебя из серии «Я хочу собрать автомобиль. Я уже взял карбюратор и двигатель, примотал их друг к другу изолентой и приклеил по бокам два деревянных колеса. Как теперь организовать трансмиссию?».

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

Кроме того, ты, пытаясь сэкономить время, выбрал дурацкое решение (разбивать по символам, а не по словам), и теперь убеждаешься в справедливости поговорки «Скупой платит дважды».

«Как мне кажется».

proud_anon ★★★★★
( 20.02.15 20:05:34 MSK )

ps. объясни, что тебе нужно в textwrap. и как надо детектить «новые записи» (+1 строка после таймера, или по следующему числу или ещё как?)

остальное — режем текст через .splitlines(), берём текстовые строки (которые не дата и не время), приводим их к единому виду через ‘ ‘.join(engstr.split()) — это ключи. так же делаем с переводом, и получаем значение. и тупо заменяем позицию в линии на её значение.

когда это заработает — тогда уже приделывать wrap или что там нужно опционально. а не пытаться решить все задачи в одной функции.

buratino ★★★★★
( 20.02.15 20:07:17 MSK )
Ответ на: комментарий от chemtech 20.02.15 20:04:01 MSK

меня тоже никто не учил. но я сначала философию понял, потом сделал несколько вещей, и только потом осилил hello, world 🙂

buratino ★★★★★
( 20.02.15 20:08:05 MSK )
Ответ на: комментарий от chemtech 20.02.15 20:02:34 MSK

re.match('^.>>\w*\W?'.format(LenSrtLine), en2rus[key]).group(0)

Хотя, наверное, есть более «питонистый» способ.

proud_anon ★★★★★
( 20.02.15 20:08:18 MSK )
Последнее исправление: proud_anon 20.02.15 20:08:32 MSK (всего исправлений: 1)

Ответ на: комментарий от buratino 20.02.15 20:07:17 MSK

Я пытаюсь разделить перевод на части используя textwrap. Т.е. вы хотите из

There's no point, I just think it's a good idea for a T-shirt. 
There's no point, I just think it's a good idea for a T-shirt. 

Как работать со словарями в Python

Словарь создают с помощью ключевого слова dict, синтаксиса языка.

Словари (dict) в Pythoт

Анастасия Хамидулина
Автор статьи
13 июня 2022 в 15:01

Словарь — это структура данных, которая позволяет записывать и получать различные значения по ключу. В некоторых языках ключами и значениями словаря могут быть только специфические объекты. А в Python — любые сущности: вплоть до пользовательских классов.

Как работать со словарями в Python

�� Создать

Ключевое слово dict

В Python есть множество встроенных функций. В том числе, чтобы получить стандартные структуры данных или преобразовать объекты к этим структурам. Если нужно создать пустой словарь, напишите:

my_new_dict = dict()

Еще, чтобы получить объект словаря, можно использовать синтаксис языка:

another_dict =

Третий способ: применить выражение — генератор словаря. Это помогает составить словарь из пары итерируемых объектов, то есть объектов, которые можно повторять. Например:

list_one = ["one", "two", "three", "four", "five"] list_two = [1, 2, 3, 4, 5] the_dict = <> for k, v in zip(list_one, list_two): the_dict[k] = v + 1 print(the_dict["one"]) 2 print(the_dict["two"]) 3 print(the_dict.keys()) dict_keys(['one', 'two', 'three', 'four', 'five'])

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

list_one = ["one", "two", "three", "four", "five"] list_two = [1, 2, 3, 4, 5] the_dict = dict(zip(list_one, list_two))

�� Получить значения

Для этого нужно обратиться к объекту словаря и указать нужный ключ:

the_dict = let_a = the_dict[0] let_b = the_dict[1] print(f" -- ") AB -- CD

�� Добавить, изменить и удалить элементы

Нужно обратиться по ключу к объекту словаря, выполнить операцию присваивания:

# добавление элементов the_dict = <> the_dict["my_key"] = "some value" the_dict["my_another_key"] = 42 # изменение элементов the_dict["my_key"] = "yet another value" # удаление элементов del the_dict["my_key"]

�� Проверить наличие ключа

Чтобы проверить, есть ли указанный ключ в словаре, используйте ключевое слово in или метод get словаря:

the_dict = print("c" in the_dict) False print("a" in the_dict) True

Метод get объекта словаря возвращает найденное значение в словаре по ключу. Или значение, указанное как стандартное возвращаемое, — если ключ не найден:

the_dict = if not the_dict.get("A", None): print("Такой ключ не найден") Такой ключ не найден a = the_dict.get("a", None) print(a) 1

�� Скопировать словарь

Чтобы получить неглубокую копию, вызовите метод copy или примените метод модуля copy: copy.copy. Если нужна глубокая, нужен метод copy.deepcopy.

import copy the_dict = dict_copy = the_dict.copy() dict_copy2 = copy.copy(the_dict) # то же самое, что и в примере выше deep_copy = copy.deepcopy(the_dict) # полная, глубокая копия

�� Определить длину словаря

Узнайте, сколько ключей содержит словарь, с помощью встроенной функции len. Она возвращает количество итерируемых объектов.

the_dict = length = len(the_dict) print(length) 2

Этому учат на курсе Skypro «Python-разработчик». Программа построена так, что вы упражняетесь на реальных задачах, а не просто изучаете отдельные блоки. В результате свои курсовые работы сможете положить в портфолио, чтобы повысить шансы найти хорошую работу еще в процессе обучения.

Python-разработчик: новая работа через 9 месяцев
Получится, даже если у вас нет опыта в IT

Итерация словаря

Pandas: обзор библиотеки для Python

Ключи, значения или всё вместе получают с помощью трех методов словаря. Для ключей — keys, для значений — values, для ключей и значений — items. Вызывать метод keys необязательно, так как при попытке итерации по словарю по умолчанию будут использоваться его ключи. По всем полученным данным можно произвести итерацию — повторить какое-либо действие.

✔️ По ключам

the_dict = for k in the_dict.keys(): print(k) print(the_dict[k]) a 1 b 2

Keys используется по умолчанию, чтобы получить объект итератора:

the_dict = for k in the_dict: # вызова keys не происходит print(k) print(the_dict[k]) a 1 b 2

✔️ По значениям

the_dict = for v in the_dict.values(): print(v) 1 2

✔️ По ключам и значениям

Пример распаковки кортежа вида «ключ, значение», чтобы сохранить их в отдельные переменные:

the_dict = for k, v in the_dict.items(): print(f" - ") a - 1 b - 2

Другие методы

✔️ fromkeys

Этот метод позволяет создавать словари с ключами, полученными из итерируемого объекта. В качестве значения по умолчанию используется второй аргумент функции:

the_list = ["a", "b"] the_dict = dict.fromkeys(the_list, False) for v in the_dict.values(): print(v) False False for k in the_dict: print(k) a b

✔️ setdefault

Метод помогает указать стандартное значение ключа. При этом не изменять его, если оно уже есть по переданному ключу:

the_dict = the_dict.setdefault("a", True) print(the_dict.keys()) dict_keys(['a', 'b']) print(the_dict.get("a", None)) 1

Изучить все методы можно на курсе Skypro «Python-разработчик». Опытные преподаватели-практики дадут необходимый минимум теории, помогут освоить практические навыки и поделятся лайфхаками разработки.

Вложенные словари

Словари могут содержать другие словари: в Python их называют вложенными. Они полезны при сериализации и десериализации. Их создают так:

the_dict = nested_dict = the_dict["color"] = nested_dict print(the_dict) >

Альтернативные типы данных

В старых версиях Python ключи словаря не были упорядочены. Чтобы решить эту проблему, использовали модуль collections, а именно объект OrderedDict. Этот модуль тоже содержит и другие варианты словаря.

✔️ OrderedDict

Вместо типичной реализации по типу хеш-таблицы эта использует список кортежей, чтобы сохранять порядок ключей. В новых версиях языка в этом объекте уже нет смысла:

import collections the_dict = collections.OrderedDict() print(the_dict) OrderedDict([('a', 1), ('b', 2), (3, 'c')]) the_dict["d"] = "value" print(the_dict) OrderedDict([('a', 1), ('b', 2), (3, 'c'), ('d', 'value')])

✔️ Defaultdict

Объект класса defaultdict позволяет избежать ошибки KeyError при обращении к несуществующему ключу. Он возвращает стандартное значение, вычисляемое указанной функцией:

from collections import defaultdict def get_value(): return "Ключ не указан" the_dict = defaultdict(get_value) the_dict["a"] = 1 the_dict["b"] = 2 print(the_dict["a"]) 1 print(the_dict["b"]) 2 print(the_dict["c"]) Ключ не указан

✔️ Counter

Объект класса Counter полезен, когда нужно получить количество повторов объектов итерируемой сущности:

from collections import Counter the_string = "AABCBBCAACBCABBABABBACCACBCBBBCA" the_counter = Counter(the_string) print(the_counter) Counter()

dict.has_key

Проверка наличия ключа в словаре этим способом устарела, вместо неё следует использовать конструкцию ключ in словарь.

 my_dict =  
key_exists = my_dict.has_key('key') # Устаревший способ.
key_exists = 'key' in my_dict # Актуальный способ.

Синонимы поиска: dict.has_key, dict, has_key

На заметку

В соответствующем разделе вы можете зарегистрировать сообщество по интересам, чтобы о нём узнали и другие посетители сайта — возможно, так вы отыщите новых единомышленников и друзей.. И не важно виртуальное оно, или вполне реальное, давно существующее, или только-только придуманное.

Python проверка наличия элемента в словаре, ошибка?

ругается «Для получения списка городов вызовите метод values()». Подскажите куда его нужно правильно вставить?

def is_anyone_in(collection, city): if city in friends.values(): # если есть среди значений словаря collection for name in friends: # переберите все ключи словаря if city == friends[name]: # если соответствующее ключу значение равно city print('В городе ' + city + ' живёт ' + name + '.') else: print('Пока никого.') friends = < 'Серёга': 'Омск', 'Соня': 'Москва', 'Дима': 'Челябинск', 'Алина': 'Хабаровск', 'Егор': 'Пермь' >is_anyone_in(friends, 'Хабаровск')
  • Вопрос задан более трёх лет назад
  • 2133 просмотра

3 комментария

Простой 3 комментария

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *