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

Как разделить словарь на части python

  • автор:

Разделение строки на список слов в Python

Часто при работе с текстовыми данными стоит задача разделить строку на отдельные слова. Например, есть строка «Привет, мир! Это мой первый код на Python». Цель — преобразовать эту строку в список, где каждое слово будет отдельным элементом: [«Привет,», «мир!», «Это», «мой», «первый», «код», «на», «Python»].

В языке программирования Python для разделения строки на слова используется встроенный метод split() . Он разделяет строку на подстроки на основе указанного разделителя. Если разделитель не указан, метод split() разделяет строку по пробелам.

Вот простой пример использования метода split() :

text = "Привет, мир! Это мой первый код на Python" words = text.split() print(words)

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

['Привет,', 'мир!', 'Это', 'мой', 'первый', 'код', 'на', 'Python']

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

Таким образом, метод split() позволяет легко и быстро разделить строку на отдельные слова и сохранить их в списке для дальнейшей обработки.

Как в Python разбить строку на символы

3 простых способа, которые можно использовать в работе и пет-проектах.

Иллюстрация: Оля Ежак для Skillbox Media

Дмитрий Зверев

Дмитрий Зверев

Любитель научной фантастики и технологического прогресса. Хорошо сочетает в себе заумного технаря и утончённого гуманитария. Пишет про IT и радуется этому.

А зачем, собственно, в Python разбивать строки на символы? Например, для того, чтобы проверять правильность пароля и почты клиента, когда он регистрируется в онлайн-сервисе.

Скажем, на нашем сайте есть требование: в пароле должны быть как минимум одна заглавная, одна строчная буква и одна цифра. Мы можем написать скрипт на Python, который проверяет каждый символ и выносит вердикт: верный пароль или нет.

Если вы ещё не знакомы с Python, советуем прочитать нашу статью, в которой мы рассказываем, как быстро и бесплатно изучить этот замечательный язык программирования.

Циклы for и while, или метод «в лоб»

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

Самый примитивный способ поделить строку на символы — сделать это с помощью циклов. Выбираем нужные символы из строки и складываем в список.

Выглядит это так:

Генераторы списков — то же, что и for, но короче

Как работает: делает то же самое, что и цикл for, но записывается всего в одну строчку.

password = 'f#da94AAd' symbols = [symbol for symbol in password] print(symbols)
['f', '#', 'd', 'a', '9', '4', 'A', 'A', 'd']

Здесь мы использовали встроенную в Python возможность — list comprehension. Термин сложно перевести на русский, поэтому его называют генератором списков.

Суть простая — это обычный цикл for, который записывается в одну строчку. Чтобы понять, как он работает, перепишем код выше в виде обычного цикла for:

# symbols = [symbol for symbol in password] symbols = [] for symbol in password: symbols += symbol

В короткой записи мы указываем, из какого списка берём элементы — in password, как будем именовать текущий элемент — for symbol, и что делаем с самим элементом — просто сохранять в неизменном виде: symbol.

�� Генераторы списков позволяют записывать длинный цикл for в одну строку. Это полезно, когда не нужно сильно изменять данные, а нужно просто сохранить их.

Функция list — для самых продуктивных

Как работает: делает то же самое, что и циклы for и while, но сокращает количество строк кода.

Когда не хотим писать даже пару строк кода, но разложить строку на символы всё ещё нужно, на помощь приходит функция list. Она превращает набор элементов в список:

password = 'f#da94AAd' symbols = list(password) print(symbols)
['f', '#', 'd', 'a', '9', '4', 'A', 'A', 'd']

Получили такой же результат, но использовали всего одну строку кода. Очень неплохо.

Проверим работу функции проверки пароля:

if check_password(symbols): print('Пароль верный') else: print('Пароль неверный')
'Пароль верный'

�� Функция list — самая лаконичная. Чтобы получить список символов, из которых состоит строка, достаточно просто вызвать функцию со строкой в качестве аргумента.

Что запомнить

Выделим главные тезисы из статьи:

  • использование циклов for и while — это самый простой, но не самый эффективный способ достать из строки все символы;
  • генераторы списков — это удобная и короткая замена цикла for;
  • применение функции list — самый короткий способ разбить строку на символы.

Читайте также:

  • Словари в Python: что нужно знать и как пользоваться
  • «Прошёл модуль курса и начал рассылать резюме»: музыкант, который стал питонистом
  • Создаём первую игру на Python и Pygame

Разбить dict на строки python?

phaggi

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

kshnkvn

Это и так строки.
Сергей Горностаев @sergey-gornostaev Куратор тега Python
Несколько раз перечитал вопрос, но так ничего и не понял.

Gremlin92

Евгений Петряев @Gremlin92 Автор вопроса
Сергей Горностаев, Ivan Yakushenko, нужно получить массив b[0] =

kshnkvn

Евгений Петряев, у тебя был словарь, который ты зачем то преобразовал в строку функцией str

Gremlin92

Евгений Петряев @Gremlin92 Автор вопроса

Ivan Yakushenko, у меня код немного другой, я не в курсе как вам словарь задать в коде, поэтому написал в виде строк

Сергей Горностаев @sergey-gornostaev Куратор тега Python

Евгений Петряев, преобразовать строковое представление словаря в словарь намного сложнее, чем освоить литералы.

Евгений Петряев, так в реальности эти значения (a[0], a[1]) — словарь или же строка в виде словаря? Разница значительная.

phaggi

Алан Гибизов @phaggi Куратор тега Python

Сергей Горностаев, литералы, к сожалению, очень трудно найти новичку — только книга «Изучаем Python» М.Лутца помогла мне понять, что к чему. До этого полгода я рыл сеть, но нигде не было прям вот четко разъяснено; я не полностью понимал их суть, хотя чувствовал, что там всё глубже, чем кажется. Но даже в официальной документации непросто понять, что скобки — не просто скобки.

kshnkvn

Алан Гибизов, много думать бывает вредно; литералы — просто представление данных, обычный термин, не нужно к нему относиться как-то особенно.

MinTnt

Алан Гибизов, вообще, довольно интересная темка. Написано «словарь», по итогу даны строки. Цель вопроса — разбить на строки. И вот казалось бы, или вопрос уже решен, или же нужно превратить этот список в словарь, чтоб уже потом его разделить на строки (судя по заданному вопросу)

phaggi

Алан Гибизов @phaggi Куратор тега Python

Ivan Yakushenko, это вам «изнутри» кажется всё просто. Когда приходишь из VBA или Cpp в Python, кое-что совершенно не интуитивно. Само слово «литерал» по отношению к тем же скобкам не воспринимается как что-то, на что надо обратить внимание.

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

А на начальном уровне Python выглядит как бейсик из Spectrum, только со странным поведением скобок.

phaggi

Алан Гибизов @phaggi Куратор тега Python

MinTnt, да что тут гадать? Пусть топикстартер поправит вопрос, приведёт реальный код, реальные входные данные и что ожидает на выходе. Тогда и поговорить можно.

Для начала преобразуй это в словарь:

import datetime d = eval(a[0]) #потом можно использовать например так ditems = d.items() #dict_items([('id', 1), ('nickname', 'bla'), ('email', 'bla@mail.ru'), ('password', '63a9f0ea7bb98050796b649e85481845'), ('reg_date', datetime.datetime(2018, 11, 13, 17, 27, 21)), ('ip', '127.0.0.1'), ('user_agent', 'Mozilla/5.0 (Windows NT 6.1; rv:16.0) Gecko/20100101 Firefox/16.0'), ('phone', '88000000000')])

Непонятно, какой . (глупый человек) запаковал данные в таком виде, что распарсить их можно только через небезопасный eval()? Неужели нельзя было использовать JSON?

Разбить dict на строки python?

3 раза прочитал и не понял что тебе сделать надо. Давай описывай нормально.

ggrn ★★★★★
( 11.01.21 10:31:20 MSK )

Hint: такого словаря не должно быть, а должна быть сериализуемая структура JSON.

vvn_black ★★★★★
( 11.01.21 10:33:18 MSK )
Ответ на: комментарий от ggrn 11.01.21 10:31:20 MSK

куски строки 1,3,5(id,nickname,…) и т.д. это индексы ассоциативного массива,2,4,6(1,bla. ) и т.д. это его значения, мне они и нужны

bad_master ★
( 11.01.21 10:34:01 MSK ) автор топика
Последнее исправление: bad_master 11.01.21 10:42:27 MSK (всего исправлений: 2)

Ответ на: комментарий от vvn_black 11.01.21 10:33:18 MSK

json выдает такую ошибку TypeError: Object of type datetime is not JSON serializable

bad_master ★
( 11.01.21 10:39:50 MSK ) автор топика

a=<> a[0] = x = str(a[0].get("id"))+' '+str(a[0].get("nickname")) print(x) 

обрати внимание datetime.datetime(2018, 11, 13, 17, 27, 21) – это косяк, прям косяк косяк

Morin ★★★★
( 11.01.21 10:43:01 MSK )
Последнее исправление: Morin 11.01.21 10:43:57 MSK (всего исправлений: 1)

Ответ на: комментарий от Morin 11.01.21 10:43:01 MSK

bad_master ★
( 11.01.21 10:44:12 MSK ) автор топика
Ответ на: комментарий от bad_master 11.01.21 10:39:50 MSK

‘reg_date’: datetime.datetime(2018, 11, 13, 17, 27, 21),

Приведи datetime к строке, при помощи strftime(ТУТ НУЖНЫЙ ТЕБЕ ФОРМАТ)

ggrn ★★★★★
( 11.01.21 10:45:04 MSK )
Последнее исправление: ggrn 11.01.21 10:45:33 MSK (всего исправлений: 1)

>>> a = >>> ';'.join(map(str, a.values())) '1;2' >>> ";".join(map(str, a.keys())) 'a;b' >>> len(a) 2 

crutch_master ★★★★★
( 11.01.21 10:46:12 MSK )
Последнее исправление: crutch_master 11.01.21 10:48:27 MSK (всего исправлений: 1)

Ответ на: комментарий от bad_master 11.01.21 10:28:32 MSK

a[0] = eval("") 

AntonI ★★★★
( 11.01.21 11:08:40 MSK )
Ответ на: комментарий от crutch_master 11.01.21 10:46:12 MSK

а как потом перебирать в цикле этот join?

bad_master ★
( 11.01.21 11:12:44 MSK ) автор топика
Ответ на: комментарий от crutch_master 11.01.21 10:46:12 MSK

 j = 0 i = 0 for row in a: words = ' '.join(map(str, a[j].values())) while i < len(a[0]): self.tableWidget.setItem(j, i, QTableWidgetItem(words)) i = i + 1 j = j + 1 i = 0 

bad_master ★
( 11.01.21 11:19:15 MSK ) автор топика
Последнее исправление: bad_master 11.01.21 11:19:51 MSK (всего исправлений: 1)

Ответ на: комментарий от bad_master 11.01.21 11:12:44 MSK

А тебе надо было перебирать его в цикле? Ты хотел разбить, я его разбил. Описывай задачу полностью, я не хочу играть в бабку-угадку.

crutch_master ★★★★★
( 11.01.21 11:48:16 MSK )
Последнее исправление: crutch_master 11.01.21 11:53:45 MSK (всего исправлений: 3)

In [18]: data Out[18]: "" In [19]: entry = eval(data); type(entry) Out[19]: dict In [20]: entry Out[20]: 

thunar ★★★★★
( 11.01.21 11:51:32 MSK )
Ответ на: комментарий от thunar 11.01.21 11:51:32 MSK

Да у него есть словарь скорее всего. Начале он просто выхлоп запостил.

crutch_master ★★★★★
( 11.01.21 11:52:52 MSK )
Ответ на: комментарий от crutch_master 11.01.21 11:52:52 MSK

Ну тогда всё таки нужно ждасть от ТСа чёткую формулировку задачи.

thunar ★★★★★
( 11.01.21 11:55:42 MSK )
Ответ на: комментарий от bad_master 11.01.21 11:19:15 MSK

//i = i + 1 i += 1 //while i < len(a[0]): Зачем len(a[0]) раз заводть в tableWidget список значений всех полей? 

crutch_master ★★★★★
( 11.01.21 12:03:48 MSK )
Ответ на: комментарий от thunar 11.01.21 11:55:42 MSK

Ну тогда всё таки нужно ждасть от ТСа чёткую формулировку задачи.

Да. Я понял примерно, что он хочет, то тоже хочу это узнать он него, мухахахаха.

crutch_master ★★★★★
( 11.01.21 12:05:14 MSK )
Последнее исправление: crutch_master 11.01.21 12:05:45 MSK (всего исправлений: 1)

Ответ на: комментарий от crutch_master 11.01.21 12:05:14 MSK

он зачем-то хочет перебирать это в цикле, хотя все уже сделано для удобства в виде словаря, ну видимо так задачу поставили через жО

либо он читает задание через опять же жО (:

Morin ★★★★
( 11.01.21 12:14:36 MSK )
Ответ на: комментарий от crutch_master 11.01.21 11:48:16 MSK

Надо бы в self.tableWidget.setItem(j, i, QTableWidgetItem(words)) в каждую ячейку записать значения которые мы разбили в строку

bad_master ★
( 11.01.21 12:31:37 MSK ) автор топика
Ответ на: комментарий от bad_master 11.01.21 12:31:37 MSK

Все значения в каждую ячейку?

crutch_master ★★★★★
( 11.01.21 12:34:35 MSK )
Ответ на: комментарий от bad_master 11.01.21 12:31:37 MSK

блин, открой уже справку

на тебе итератор

for key, value in a[0].items(): print(value) 

Morin ★★★★
( 11.01.21 12:42:04 MSK )
Ответ на: комментарий от crutch_master 11.01.21 12:34:35 MSK

bad_master ★
( 11.01.21 12:42:29 MSK ) автор топика
Ответ на: комментарий от bad_master 11.01.21 12:42:29 MSK

Т.к. нормальной формулировкой вы нас обделили, попробую угадать

t = for i, p in enumerate(t): print(i, p, t[p]) 

AKonia ★★
( 11.01.21 13:18:25 MSK )
Последнее исправление: AKonia 11.01.21 13:19:09 MSK (всего исправлений: 1)

Ответ на: комментарий от Norgat 11.01.21 10:24:37 MSK

X512 ★★★★★
( 11.01.21 13:22:51 MSK )
Ответ на: комментарий от AKonia 11.01.21 13:18:25 MSK

надо вот в таблицу занести каждый столбик и строку, у меня пока что получается все в каждую ячейку вписать, а хочу чтобы id в первый столбец, nickname во 2й, почта в третий, пароль в четвертый и т.д.

bad_master ★
( 11.01.21 13:29:13 MSK ) автор топика
Последнее исправление: bad_master 11.01.21 13:58:38 MSK (всего исправлений: 1)

Ответ на: комментарий от bad_master 11.01.21 13:29:13 MSK

А в чём проблема ? Неужели трудно из моего примера скормить значения в функцию установки значений виджетов ?

t = for i, p in enumerate(t): self.tableWidget.setItem(1, i+1, QTableWidgetItem(p)) self.tableWidget.setItem(2, i+1, QTableWidgetItem(t[p])) 

Если подвох в том, что у вас не словарь, а массив из строк(внутри которых словарь), то сверху в цикле:

for t in [eval(tablized) for tablized in a]: 

AKonia ★★
( 11.01.21 14:01:37 MSK )
Последнее исправление: AKonia 11.01.21 14:06:23 MSK (всего исправлений: 7)

Перестаньте кормить XY проблему

Goury ★★★★★
( 11.01.21 14:14:51 MSK )
Ответ на: комментарий от bad_master 11.01.21 12:42:29 MSK

Ну так твой код это и делает.

crutch_master ★★★★★
( 11.01.21 16:40:28 MSK )
Ответ на: комментарий от bad_master 11.01.21 13:29:13 MSK

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

Вооот. Почему это надо вытягивать из тебя терморектальным методом?

 j = 0 for row in a: i = 0 for value in row.values(): self.tableWidget.setItem(j, i, QTableWidgetItem(value)) i += 1 j += 1 

Кто-нибудь этот кусок может лучше переписать? Решил выучить пистон, как берусь, каждый раз блевануть охота.

crutch_master ★★★★★
( 11.01.21 16:46:42 MSK )
Ответ на: комментарий от crutch_master 11.01.21 16:46:42 MSK

там смешнее будет, когда в словаре будет пропущен кей, ибо нулевой ибо в его не заполнили 🙂

но кто мы чтоб судить, правда?

Morin ★★★★
( 11.01.21 16:50:15 MSK )
Ответ на: комментарий от Morin 11.01.21 16:50:15 MSK

там смешнее будет, когда в словаре будет пропущен кей
но кто мы чтоб судить, правда?

Ну сделай nullcheck как надо. Я правда хз, как на этой херне надо писать.

crutch_master ★★★★★
( 11.01.21 16:59:05 MSK )
Ответ на: комментарий от Morin 11.01.21 16:50:15 MSK

Выше же метод get() советовали. Как раз для такого.

Shadow ★★★★★
( 11.01.21 17:05:17 MSK )
Ответ на: комментарий от Shadow 11.01.21 17:05:17 MSK

на никнейм погляди 🙂

не ну как задачу описали, так и отвечаем))) это я просто к граблям присматриваюсь, а их можно еще накопать

Morin ★★★★
( 11.01.21 17:14:54 MSK )
Ответ на: комментарий от crutch_master 11.01.21 16:59:05 MSK

хз из чего портянка словарей составлена.

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

конечно это все догадки, что кто-то не хотел фиксированный формат словаря

Morin ★★★★
( 11.01.21 17:17:43 MSK )
Ответ на: комментарий от crutch_master 11.01.21 16:46:42 MSK

QTableWidgetItem(QTableWidgetItem): argument 1 has unexpected type ‘datetime.datetime’

bad_master ★
( 11.01.21 17:18:24 MSK ) автор топика
Ответ на: комментарий от bad_master 11.01.21 17:18:24 MSK

тебя уже в это выше тыкали

Morin ★★★★
( 11.01.21 17:20:53 MSK )
Ответ на: комментарий от bad_master 11.01.21 17:18:24 MSK

str(value). Всё за тебя делать? И думать, и код писать? Может я з/п еще за тебя получать буду?

crutch_master ★★★★★
( 11.01.21 18:06:27 MSK )
Последнее исправление: crutch_master 11.01.21 18:07:08 MSK (всего исправлений: 1)

Ответ на: комментарий от crutch_master 11.01.21 18:06:27 MSK

Я новичок, это пишу свою первую программу. Нет зп, буду книгу читать чтобы хоть что-то знать. Если работает то всех благодарю

bad_master ★
( 11.01.21 19:10:00 MSK ) автор топика
Ответ на: комментарий от crutch_master 11.01.21 16:46:42 MSK

Вместо внешних i, j кошернее завернуть в enumerate.

thunar ★★★★★
( 11.01.21 19:46:12 MSK )
Ответ на: комментарий от Norgat 11.01.21 10:24:37 MSK
WitcherGeralt ★★
( 11.01.21 19:49:12 MSK )
Ответ на: комментарий от bad_master 11.01.21 10:39:50 MSK

Так добавь сериализацию дейттайма, проблема-то.

WitcherGeralt ★★
( 11.01.21 19:50:39 MSK )
Ответ на: комментарий от crutch_master 11.01.21 16:46:42 MSK

UPD. Тебе выше даже показали уже.

WitcherGeralt ★★
( 11.01.21 20:11:05 MSK )
Последнее исправление: WitcherGeralt 11.01.21 20:12:06 MSK (всего исправлений: 1)

Ответ на: комментарий от bad_master 11.01.21 10:39:50 MSK

И тем не менее это json. Точнее, json рукожопа. В отличие от json здорового человека, перепутаны кавычки (должны быть двойные) и, как заметил Morin, грубый косяк с datetime

Нужно вломить коллеге, который написал экспорт, а не пытаться изобрести гнутый молоток

router ★★★★★
( 12.01.21 02:45:07 MSK )
Ответ на: комментарий от bad_master 11.01.21 19:10:00 MSK

Лучше давай всю задачу прямо с примера в виде файла с поступающими данными (сами данные можешь заменить на имярек1 имярек2 и так далее, но дать полный минимальный пример) как есть и нормально обсудим как её правильно решать, потому что то что я увидел в треде (не только от тебя но и в виде советов) ужасно настолько, что у меня волосы дыбом встали.

Как выше упомянули коллеге надо вломить по рукам за создание велосипедов.

Самый ужас от твоей формулировки:

Вот от этого прямо кровь из глаз.

peregrine ★★★★★
( 12.01.21 03:31:04 MSK )
Последнее исправление: peregrine 12.01.21 03:35:53 MSK (всего исправлений: 2)

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

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