347

私はPythonを学び、データベース接続を作成しています。DBに追加しようとしているときに、情報からタプルを作成してDBに追加することを考えています。

私がしていること:私はユーザーから情報を取得し、それを変数に格納しています。これらの変数をタプルに追加できますか?構文を手伝ってもらえますか?

また、これを行う効率的な方法がある場合は、共有してください...

編集 この質問を少し編集しましょう...DBに情報を入力するために必要なのはタプルだけです。情報がDBに追加されたら、タプルを削除する必要がありますか?つまり、タプルはもう必要ありません。

4

8 に答える 8

460

タプルは不変です。構築後に含まれる変数を変更することはできません。ただし、それらを連結またはスライスして、新しいタプルを形成することができます。

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)
于 2009-09-04T18:39:39.047 に答える
251

のような空白のタプルから始めることができます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)
于 2011-12-16T18:43:21.517 に答える
57

Python 3では、を使用*して、元のタプルから新しい要素の新しいタプルを作成できます。

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

バイトコードはほぼ同じですtuple1 + ("baz",)

Python 3.7.5 (default, Oct 22 2019, 10:35:10) 
[Clang 10.0.1 (clang-1001.0.46.4)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> def f():
...     tuple1 = ("foo", "bar")
...     tuple2 = (*tuple1, "baz")
...     return tuple2
... 
>>> def g():
...     tuple1 = ("foo", "bar")
...     tuple2 = tuple1 + ("baz",)
...     return tuple2
... 
>>> from dis import dis
>>> dis(f)
  2           0 LOAD_CONST               1 (('foo', 'bar'))
              2 STORE_FAST               0 (tuple1)

  3           4 LOAD_FAST                0 (tuple1)
              6 LOAD_CONST               3 (('baz',))
              8 BUILD_TUPLE_UNPACK       2
             10 STORE_FAST               1 (tuple2)

  4          12 LOAD_FAST                1 (tuple2)
             14 RETURN_VALUE
>>> dis(g)
  2           0 LOAD_CONST               1 (('foo', 'bar'))
              2 STORE_FAST               0 (tuple1)

  3           4 LOAD_FAST                0 (tuple1)
              6 LOAD_CONST               2 (('baz',))
              8 BINARY_ADD
             10 STORE_FAST               1 (tuple2)

  4          12 LOAD_FAST                1 (tuple2)
             14 RETURN_VALUE

唯一の違いはBUILD_TUPLE_UNPACKvsBINARY_ADDです。正確なパフォーマンスはPythonインタープリターの実装によって異なりますが、多態的な演算子であるためBUILD_TUPLE_UNPACKよりも高速に実装するのが自然であり、追加の型計算と暗黙的な変換が必要になります。BINARY_ADDBINARY_ADD

于 2018-06-22T10:34:14.043 に答える
49

まだ言及されていない別の戦術は、リストへの追加を使用し、最後にリストをタプルに変換することです。

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

戻り値

(0, 1, 2, 3, 4)

タプルを関数の引数として渡す必要がある場合にこれを使用することがあります。これは、numpy関数で必要になることがよくあります。

于 2014-05-07T23:20:59.740 に答える
9

「情報がDBに追加されたら、タプルを削除する必要がありますか?つまり、タプルはもう必要ありません。」

いいえ。

通常、何も削除する理由はありません。削除するためのいくつかの特別なケースがありますが、それらは非常にまれです。

狭いスコープ(つまり、クラス内の関数定義またはメソッド関数)を定義するだけで、オブジェクトはスコープの最後でガベージコレクションされます。

何も削除する必要はありません。

[ノート。私は、オブジェクトを削除しようとすることに加えて、オブジェクトをクリアするために常に「リセット」メソッドを作成していた人と協力しました。彼がそれらを保存して再利用しようとしていたように。また、ばかげたうぬぼれ。使用しなくなったオブジェクトは無視してください。関数を十分に小さいコードブロックで定義する場合、これ以上考えることはありません。]

于 2009-09-04T20:06:31.850 に答える
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のタプルは不変であるため、一度作成されたタプルに変数を追加することはできません。

于 2009-09-04T18:39:30.247 に答える
4

他の回答が指摘しているように、既存のタプルを変更することはできませんが、いつでも新しいタプルを作成できます(既存のタプルや他のソースから一部またはすべてのアイテムを取得する場合があります)。

たとえば、対象のすべての項目がスカラー変数にあり、それらの変数の名前がわかっている場合:

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())

もちろん、この1つのケースは、より単純に(x, y, z)(または名前の前に(23, 45, 67))として表現されますが、このmaketupleアプローチは、より複雑なケース(たとえば、使用する名前も動的に決定され、リストに追加される場合)で役立つ場合があります。計算)。

于 2009-09-04T18:47:11.370 に答える
2

Pythonでのこれの構文は次のとおりです。

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

一度設定すると、タプルは変更できません。

于 2009-09-04T18:39:31.667 に答える