Как проверить: является ли строка частью ключа словаря в 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, синтаксиса языка.

Анастасия Хамидулина
Автор статьи
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

Итерация словаря
https://sky.pro/media/obzor-biblioteki-pandas/
Ключи, значения или всё вместе получают с помощью трех методов словаря. Для ключей — 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 комментария
