Я все еще пытаюсь понять, как манипулировать строками в Python. В настоящее время мне нужно использовать 4 строки, чтобы перейти от
('Al Jahar',)
к
'Al Jahar'
Это код, который я использую. Прекрасно работает, но хотелось бы сделать его более элегантным и питоническим.
selected_monster = f"{selected_monster}"
selected_monster = selected_monster[:-2] + selected_monster[-1]
selected_monster = selected_monster[:-1]
selected_monster = selected_monster[1:]
print(selected_monster)
Я не могу просто удалить/заменить символы «()» на «», потому что в названиях некоторых монстров эти символы есть, например: «Смотрящий (бла-бла)» или «Дракон, Зеленый». ВСЕ имена взяты из базы данных и имеют эту разметку вокруг тега имени «Имя монстра». Поэтому, если я попробую метод замены, заголовки испортятся, и я не смогу использовать их в качестве строковых переменных в своем коде.
Результаты, поступающие из базы данных, не являются строками. Вы получаете список строк, и каждая строка представляет собой кортеж значений, даже если он только один. for row in cursor.fetch_all():
/print(row[0])
напечатает первый (или единственный) столбец в каждой строке.
Спасибо, что нашли время, Тим Робертс, я не знал, что каждая строка представляет собой кортеж, когда делал курсор.fetch_all :) Это было очень полезно.
Собираетесь ли вы показать нам код, присваивающий переменную, чтобы мы могли показать вам лучший способ сделать это (без дополнительных строк)?
@nocomment Я пытаюсь правильно отформатировать свой код, написанный здесь, и у меня возникли проблемы с выяснением этого в этой области комментариев. Это был базовый вызов sql, который возвращал все имена монстров и помещал их в CTkListbox с функцией обратного вызова по щелчку мыши (который я написал в качестве ответа, который все здесь помогли мне понять.
Вы можете использовать одинарные обратные кавычки для форматирования, как в комментарии Тима, но я бы все равно поставил это в вопрос.
('Al Jahar',)
— это кортеж. Вы можете определить это, выполнив
>>> selected_monster = ('Al Jahar',)
>>> type(selected_monster)
Чтобы получить доступ к элементу кортежа, вы можете просто проиндексировать его:
>>> selected_monster[0]
ИЛИ
>>> ('Al Jahar',)[0]
Вы также можете использовать распаковку кортежей. Версия ниже — если вы уверены, что она содержит только один элемент:
>>> selected_monster, = selected_monster
Если вы не уверены, спрячьте остаток в другом месте:
>>> selected_monster, *_ = selected_monster
Возможно, вы также захотите пересмотреть способ генерации selected_monster
, если вам нужно, чтобы это была строка.
Большое спасибо за совет! Я все еще изучаю все тонкости Python и не знаком с кратким использованием типа (selected_monster) таким образом. Это чрезвычайно полезные знания.
Рад, что это было полезно для вас. Вы можете проголосовать за и выбрать ответ, нажав на стрелку и галочку слева от него.
Как насчет использования re
?
import re
text = "('Al Jahar',)"
match = re.match(r"\('(.+?)',\)", text)
if match:
name = match.group(1)
print(name) # Output: 'Al Jahar'
После отзывов пользователей кажется, что я действительно могу делать то, что хочу, с нулевым количеством строк дополнительного кода.
Вместо того, чтобы возиться с кортежем, как если бы это была строка, я могу обойти это и просто вызвать элемент кортежа, который вернул мой предыдущий SQL-запрос.
Мое использование становится (в паре):
sql = f"SELECT Frequency FROM Monsters WHERE Name = '{selected_monster[0]}'"
Хм, да, это еще один способ использовать ноль дополнительных строк. Не тот, который я имел в виду, где в переменной будет строка, поэтому вам не понадобится [0]
(и, вероятно, потребуется только один дополнительный символ вместо трех:-)
Вполне возможно, что вы можете сделать это с нулевыми строками, если вообще избегаете этого. Не могу сказать, не видя вашего кода, который его создал.