Добавить переменные в кортеж


282

Я изучаю Python и создаю соединение с базой данных. Пытаясь добавить в БД, я думаю о создании кортежей из информации, а затем добавить их в БД.

Что я делаю : я беру информацию от пользователя и храню ее в переменных. Могу ли я добавить эти переменные в кортеж? Можете ли вы помочь мне с синтаксисом?

Также, если есть эффективный способ сделать это, пожалуйста, поделитесь ...

РЕДАКТИРОВАТЬ Позвольте мне немного отредактировать этот вопрос ... Мне нужен только кортеж для ввода информации в БД. Как только информация будет добавлена ​​в БД, я должен удалить кортеж? Я имею в виду, мне больше не нужен кортеж.

Ответы:


371

Кортежи неизменны; Вы не можете изменить, какие переменные они содержат после построения. Однако вы можете объединить или нарезать их, чтобы сформировать новые кортежи:

a = (1, 2, 3)
b = a + (4, 5, 6)  # (1, 2, 3, 4, 5, 6)
c = b[1:]  # (2, 3, 4, 5, 6)

И, конечно же, строить их из существующих ценностей:

name = "Joe"
age = 40
location = "New York"
joe = (name, age, location)

Мне нужны эти кортежи только для добавления в БД после ввода пользователя. так что я должен уничтожить эти кортежи после завершения обновления БД?
Amit

5
Вам не нужно уничтожать кортежи после обновления базы данных. Если они выходят за рамки, они должны быть собраны мусором.
Джастин Стандарт

Чтобы добавить строку в кортеж, не разрывая саму строку, проверьте stackoverflow.com/a/16449189
Энцо Ферей,

Просто добавить a = (), и b= a + (5)приводит к b = 5, следовательно, b= a + (5,)приведет к b = (5,); кортеж
yashgarg1232

222

Вы можете начать с пустого кортежа с чем-то вроде t = (). Вы можете добавить с помощью +, но вы должны добавить еще один кортеж. Если вы хотите добавить один элемент, сделать его одноплодное: t = t + (element,). Вы можете добавить кортеж из нескольких элементов с запятой или без нее.

>>> t = ()
>>> t = t + (1,)
>>> t
(1,)
>>> t = t + (2,)
>>> t
(1, 2)
>>> t = t + (3, 4, 5)
>>> t
(1, 2, 3, 4, 5)
>>> t = t + (6, 7, 8,)
>>> t
(1, 2, 3, 4, 5, 6, 7, 8)

20
В этом примере также можно сделать: t = ()затемt += (1,)
Дуглас Денхартог

2
Какая польза от включения запятой?
Сплайк

13
Конечная запятая необходима для синглтона, чтобы избежать путаницы между элементами в скобках. Простые скобки используются в порядке операций, поэтому (7) равно 7. Но (7,) - это одноэлементный кортеж, в котором элемент равен 7. Аналогично, 3 * (7 + 8) = 45, но 3 * ( 7 + 8,) = (15, 15, 15) - имеет ли это смысл?
Даниил

2
Что касается многоэлементных кортежей, запятая на 100% необязательна. Включение этого слова означает «это кортеж, я знаю, что это кортеж, я знаю, как работают кортежи, и я знаю, что могу это сделать». Но никакая запятая не может показаться более естественной. ИДК. Вам решать.
Даниил

Я думаю, что важно отметить, что кортежи неизменны - они не могут быть изменены. Это решение создает новый кортеж на основе двух существующих кортежей.
That1Guy

44

Еще одна тактика, которая еще не упомянута, - это добавление в список, а затем преобразование списка в кортеж в конце:

mylist = []
for x in range(5):
    mylist.append(x)
mytuple = tuple(mylist)
print mytuple

возвращается

(0, 1, 2, 3, 4)

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


3
Полезно знать, что обратное, т.е. list(someTuple)тоже работает. Два типа объектов, по-видимому, взаимозаменяемы
хаверим

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

41

В Python 3 вы можете использовать *для создания нового кортежа элементов из исходного кортежа вместе с новым элементом.

>>> tuple1 = ("foo", "bar")
>>> tuple2 = (*tuple1, "baz")
>>> tuple2
('foo', 'bar', 'baz')

2
Это, безусловно, самый питонический для меня.
Бумсик Ким

6
Это в 10 раз медленнее, чем tuple1 + ("baz",).
Матеин Улхак

9

«Как только информация будет добавлена ​​в БД, я должен удалить кортеж? Я имею в виду, что кортеж мне больше не нужен».

Нет.

Как правило, нет причин удалять что-либо. Есть несколько особых случаев для удаления, но они очень, очень редки.

Просто определите узкую область действия (т. Е. Определение функции или функцию метода в классе), и объекты будут собраны в конце мусора.

Не беспокойтесь об удалении чего-либо.

[Заметка. Я работал с парнем, который - в дополнение к попытке удалять объекты - всегда писал методы «сброса» для их очистки. Как будто он собирался спасти их и использовать их снова. Также глупое тщеславие. Просто игнорируйте объекты, которые вы больше не используете. Если вы определяете свои функции в достаточно маленьких блоках кода, вам больше не о чем думать.]


7

Это так же просто, как следующее:

info_1 = "one piece of info"
info_2 = "another piece"
vars = (info_1, info_2)
# 'vars' is now a tuple with the values ("info_1", "info_2")

Однако кортежи в Python являются неизменяемыми , поэтому вы не можете добавлять переменные в кортеж после его создания.


3

Как отмечали другие ответы, вы не можете изменить существующий кортеж, но вы всегда можете создать новый кортеж (который может взять некоторые или все элементы из существующих кортежей и / или других источников).

Например, если все интересующие вас объекты находятся в скалярных переменных, и вы знаете имена этих переменных:

def maketuple(variables, names):
  return tuple(variables[n] for n in names)

для использования, например, как в этом примере:

def example():
  x = 23
  y = 45
  z = 67
  return maketuple(vars(), 'x y z'.split())

конечно, этот один случай будет проще выразить как (x, y, z)(или даже вообще не упоминать имена (23, 45, 67)), но этот maketupleподход может быть полезен в некоторых более сложных случаях (например, когда имена для использования также определяются динамически и добавляются в список во время вычисление).


2

Я уверен, что синтаксис для этого в Python:

user_input1 = raw_input("Enter Name: ")
user_input2 = raw_input("Enter Value: ")
info = (user_input1, user_input2)

После установки кортежи не могут быть изменены.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.