Thêm biến vào Tuple


282

Tôi đang học Python và tạo kết nối cơ sở dữ liệu. Trong khi cố gắng thêm vào DB, tôi nghĩ đến việc tạo ra các bộ dữ liệu và sau đó thêm chúng vào DB.

Những gì tôi đang làm : Tôi đang lấy thông tin từ người dùng và lưu trữ nó trong các biến. Tôi có thể thêm các biến này vào một tuple không? Bạn có thể vui lòng giúp tôi với cú pháp?

Ngoài ra nếu có một cách hiệu quả để làm điều này, xin vui lòng chia sẻ ...

EDIT Hãy để tôi chỉnh sửa câu hỏi này một chút ... Tôi chỉ cần bộ dữ liệu để nhập thông tin vào DB. Sau khi thông tin được thêm vào DB, tôi có nên xóa tuple không? Tôi có nghĩa là tôi không cần tuple nữa.

Câu trả lời:


370

Tuples là bất biến; bạn không thể thay đổi những biến chúng chứa sau khi xây dựng. Tuy nhiên, bạn có thể nối hoặc cắt chúng để tạo thành các bộ dữ liệu mới:

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

Và, tất nhiên, xây dựng chúng từ các giá trị hiện có:

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

tôi chỉ cần những bộ dữ liệu này để thêm vào db sau khi người dùng nhập vào. Vì vậy, tôi nên phá hủy các bộ dữ liệu này sau khi cập nhật lên db được hoàn thành?
amit

5
Bạn không cần phải hủy các bộ dữ liệu sau khi cập nhật db. Nếu họ đi ra khỏi phạm vi họ nên được thu gom rác.
Justin Tiêu chuẩn

Để thêm một chuỗi vào bộ dữ liệu mà không phá vỡ chuỗi, hãy kiểm tra stackoverflow.com/a/16449189
Enzo Ferey

Chỉ cần thêm vào, a = ()b= a + (5), dẫn đến b = 5, do đó b= a + (5,), sẽ dẫn đến b = (5,); một tuple
yashgarg1232

221

Bạn có thể bắt đầu với một tuple trống với một cái gì đó như t = (). Bạn có thể thêm với +, nhưng bạn phải thêm một tuple khác. Nếu bạn muốn thêm một yếu tố duy nhất, hãy biến nó thành một singleton : t = t + (element,). Bạn có thể thêm một bộ gồm nhiều phần tử có hoặc không có dấu phẩy.

>>> 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
Trong trường hợp ví dụ này, người ta cũng có thể làm: t = ()sau đót += (1,)
Douglas Denhartog

2
Có lợi ích gì khi bao gồm dấu phẩy?
Splic

13
Dấu phẩy dấu phẩy cần thiết cho singleton để tránh nhầm lẫn giữa một phần tử trong ngoặc đơn. Dấu ngoặc đơn được sử dụng theo thứ tự các thao tác, vì vậy (7) chỉ là 7. Nhưng (7,) là một tuple một phần tử trong đó phần tử là 7. Tương tự, 3 * (7 + 8) = 45, nhưng 3 * ( 7 + 8,) = (15, 15, 15) - điều đó có ý nghĩa không?
Daniel

2
Đối với các bộ dữ liệu đa yếu tố, dấu phẩy là 100% tùy chọn. Bao gồm nó có nghĩa là "đây là một tuple, tôi biết đó là một tuple, tôi biết các tuple hoạt động như thế nào và tôi biết tôi có thể làm điều đó." Nhưng không có dấu phẩy có vẻ tự nhiên hơn. Idk. Tùy bạn
Daniel

Tôi nghĩ điều quan trọng cần lưu ý là các bộ dữ liệu là bất biến - chúng thực sự không thể được sửa đổi. Những gì giải pháp này làm là tạo ra một bộ dữ liệu mới dựa trên hai bộ dữ liệu hiện có .
That1Guy

44

Một chiến thuật khác chưa được đề cập là sử dụng nối thêm vào danh sách, sau đó chuyển đổi danh sách thành một tuple ở cuối:

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

trả lại

(0, 1, 2, 3, 4)

Đôi khi tôi sử dụng điều này khi tôi phải chuyển một tuple làm đối số hàm, điều này thường cần thiết cho các hàm numpy.


3
Thật hữu ích khi biết rằng mặt trái của điều này, tức là list(someTuple)cũng hoạt động. Hai loại đối tượng rõ ràng có thể hoán đổi cho nhau
khaverim

Không thực sự có thể hoán đổi cho nhau, tôi nghĩ việc chuyển đổi từ tuple sang danh sách sẽ sao chép tất cả các yếu tố trong danh sách, vì vậy chắc chắn có nơi để tránh nó
gbtimmon

41

Trong Python 3, bạn có thể sử dụng *để tạo một bộ phần tử mới từ bộ dữ liệu gốc cùng với phần tử mới.

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

2
Đây là cho đến nay các pythonic nhất đối với tôi.
Bumsik Kim

6
Đây là 10x chậm hơn tuple1 + ("baz",).
Mateen Ulhaq

9

"một khi thông tin được thêm vào DB, tôi có nên xóa tuple không? ý tôi là tôi không cần tuple nữa."

Không.

Nói chung, không có lý do để xóa bất cứ điều gì. Có một số trường hợp đặc biệt để xóa, nhưng chúng rất, rất hiếm.

Chỉ cần định nghĩa một phạm vi hẹp (nghĩa là một định nghĩa hàm hoặc một hàm phương thức trong một lớp) và các đối tượng sẽ là rác được thu thập ở cuối phạm vi.

Đừng lo lắng về việc xóa bất cứ điều gì.

[Ghi chú. Tôi đã làm việc với một anh chàng - ngoài việc cố gắng xóa các đối tượng - luôn viết các phương thức "thiết lập lại" để xóa chúng. Giống như anh sẽ cứu họ và tái sử dụng chúng. Cũng là một sự tự phụ ngớ ngẩn. Chỉ cần bỏ qua các đối tượng bạn không còn sử dụng. Nếu bạn xác định các hàm của mình trong các khối mã đủ nhỏ, bạn không còn gì phải suy nghĩ nữa.]


7

Thật dễ dàng như sau:

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

Tuy nhiên, các bộ dữ liệu trong Python là bất biến , vì vậy bạn không thể nối các biến vào một bộ dữ liệu một khi nó được tạo.


3

Như các câu trả lời khác đã lưu ý, bạn không thể thay đổi bộ dữ liệu hiện có, nhưng bạn luôn có thể tạo bộ dữ liệu mới (có thể lấy một số hoặc tất cả các mục từ bộ dữ liệu hiện có và / hoặc các nguồn khác).

Ví dụ: nếu tất cả các mục quan tâm nằm trong các biến vô hướng và bạn biết tên của các biến đó:

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

được sử dụng, ví dụ, như trong ví dụ này:

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

tất nhiên trường hợp này sẽ được biểu thị đơn giản hơn là (x, y, z)(hoặc thậm chí đã nói trước các tên, (23, 45, 67)), nhưng maketuplecách tiếp cận có thể hữu ích trong một số trường hợp phức tạp hơn (ví dụ: tên được sử dụng cũng được xác định một cách linh hoạt và được thêm vào danh sách trong tính toán).


2

Tôi khá chắc chắn cú pháp cho điều này trong python là:

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

một khi được đặt, các bộ dữ liệu không thể thay đổi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.