làm thế nào để thêm giá trị vào một tuple?


79

Tôi đang làm việc trên một tập lệnh mà tôi có một danh sách các bộ giá trị như thế ('1','2','3','4'). ví dụ:

list = [('1','2','3','4'),
        ('2','3','4','5'),
        ('3','4','5','6'),
        ('4','5','6','7')]

Bây giờ tôi cần phải thêm '1234', '2345', '3456''4567'tương ứng ở phần cuối của mỗi tuple. ví dụ:

list = [('1','2','3','4','1234'),
        ('2','3','4','5','2345'),
        ('3','4','5','6','3456'),
        ('4','5','6','7','4567')]

Có thể theo bất kỳ cách nào?


8
giải pháp đa ngôn ngữ? ;)
Snowbear

2
Chào mừng bạn đến với StackOverflow! Ở bên phải khi bạn hỏi câu hỏi của mình, có hộp Cách định dạng tiện dụng này . Đáng đọc, vì trang được liên kết từ [?] Ngay phía trên khu vực câu hỏi.
TJ Crowder

3
Ít nhất trong Python, các bộ giá trị là bất biến. Nếu bạn muốn "thêm thứ gì đó vào tuple", tại sao không sử dụng cấu trúc dữ liệu có thể thay đổi ngay từ đầu?
Felix Kling

2
Tôi cũng làm điều đó - thường xuyên nhất với "tệp", bởi vì "cho tệp trong tệp" rất tự nhiên! - nhưng nói chung, có lẽ bạn nên tránh gọi danh sách của mình là "danh sách", thay thế "danh sách" dựng sẵn.
DSM

Câu trả lời:


137

Tuples là bất biến và không được thay đổi - đó là những gì loại danh sách dành cho. Bạn có thể thay thế từng tuple bằng cách originalTuple + (newElement,)tạo một tuple mới. Ví dụ:

t = (1,2,3)
t = t + (1,)
print t
(1,2,3,1)

Nhưng tôi khuyên bạn nên đi với danh sách ngay từ đầu, vì chúng nhanh hơn để chèn các mục.

Và một gợi ý khác: Đừng ghi đè lên tên có sẵn listtrong chương trình của bạn, thay vào đó hãy gọi biến lhoặc một số tên khác. Nếu bạn ghi đè tên tích hợp, bạn không thể sử dụng nó nữa trong phạm vi hiện tại.


23
Một tốc kýt += 1,

1
Tuy nhiên, điểm tuyệt vời là tôi gặp phải trường hợp không may là tôi muốn thêm lặp đi lặp lại các giá trị vào sqlite3cơ sở dữ liệu và cần phải tạo một bộ giá trị để thêm (vì cú pháp bắt buộc VALUES (v1, v2, v3, ...). Trong trường hợp này, biết cách thêm giá trị vào tuple rất có lợi.
HS-nebula

16

Dựa trên cú pháp, tôi đoán đây là Python. Điểm của một tuple là nó không thay đổi được, vì vậy bạn cần thay thế mỗi phần tử bằng một tuple mới:

list = [l + (''.join(l),) for l in list]
# output:
[('1', '2', '3', '4', '1234'), 
 ('2', '3', '4', '5', '2345'), 
 ('3', '4', '5', '6', '3456'), 
 ('4', '5', '6', '7', '4567')]

5
Điều này hoạt động, chắc chắn. Nhưng điều này thực sự có nên được thực hiện? Tôi tự hỏi. Bởi vì điều này đánh bại mục đích của việc có một tuple ngay từ đầu. Hoặc là tôi sai?
user225312

9

Trong Python, bạn không thể. Tuples là bất biến.

Trong danh sách chứa, bạn có thể thay thế tuple ('1', '2', '3', '4')bằng một ('1', '2', '3', '4', '1234')tuple khác .


9

Như đã đề cập trong các câu trả lời khác, các bộ giá trị là bất biến sau khi được tạo và danh sách có thể phục vụ mục đích của bạn tốt hơn.

Điều đó nói rằng, một tùy chọn khác để tạo một bộ giá trị mới với các mục bổ sung là sử dụng toán tử biểu tượng:

new_tuple = (*old_tuple, 'new', 'items')

Tôi thích cú pháp này vì nó trông giống như một bộ tuple mới, vì vậy nó truyền đạt rõ ràng những gì bạn đang cố gắng thực hiện.

Sử dụng splat, một giải pháp tiềm năng là:

list = [(*i, ''.join(i)) for i in list]


7

Như những người khác đã trả lời, các bộ giá trị trong python là bất biến và cách duy nhất để 'sửa đổi' một bộ giá trị là tạo một bộ mới với các phần tử được nối thêm vào.

Nhưng giải pháp tốt nhất là một danh sách. Khi bất kỳ hàm hoặc phương thức nào yêu cầu tuple cần được gọi, hãy tạo một tuple bằng cách sử dụng tuple (list).


4

Tôi đã xem qua một số chi tiết liên quan đến tuplelistvà những gì tôi hiểu là:

  • Tuples là Heterogeneouskiểu dữ liệu thu thập
  • Tuple có độ dài cố định (mỗi loại tuple)
  • Tuple luôn hữu hạn

Vì vậy, để thêm mục mới vào một bộ, cần phải truyền nó tới listvà thực hiện append()thao tác trên nó, sau đó lại truyền nó trở lại bộ tuple.

Nhưng theo cá nhân tôi cảm nhận về Câu hỏi là, nếu Tuples được cho là các mục có độ dài cố định , hữu hạn và nếu chúng ta đang sử dụng các loại dữ liệu đó trong lôgic ứng dụng của mình thì sẽ không có kịch bản để thêm các mục mới HOẶC cập nhật một giá trị mục trong nó. Vì vậy, thay vì danh sách các bộ giá trị, nó nên là danh sách của chính danh sách , Tôi có đúng về điều này không?


1
Có những trường hợp mà bạn cần truyền một bộ giá trị cho một hàm, chẳng hạn như với SQL (psycopg2) hoặc tương tác với R (rpy2). Các hàm không phải lúc nào cũng hoạt động bình thường nếu được cung cấp một danh sách thay vì một bộ. Đôi khi bạn cũng nhận được một bộ giá trị từ một hàm chứ không phải một danh sách. Tuples có thể bảo vệ khỏi việc sửa đổi nhầm danh sách ban đầu khi thay vào đó bạn nên làm việc trên một bản sao của danh sách. Vì vậy, có, danh sách trực tiếp hoặc gián tiếp là trung gian trong các câu trả lời được trình bày. Tuy nhiên, việc truyền trở lại một tuple ở cuối vẫn hợp lý trong nhiều trường hợp.
Nate Wanner

2
    list_of_tuples = [('1', '2', '3', '4'),
                      ('2', '3', '4', '5'),
                      ('3', '4', '5', '6'),
                      ('4', '5', '6', '7')]


    def mod_tuples(list_of_tuples):
        for i in range(0, len(list_of_tuples)):
            addition = ''
            for x in list_of_tuples[i]:
                addition = addition + x
            list_of_tuples[i] = list_of_tuples[i] + (addition,)
        return list_of_tuples

    # check: 
    print mod_tuples(list_of_tuples)

0
OUTPUTS = []
for number in range(len(list_of_tuples))):
    tup_ = list_of_tuples[number]
    list_ = list(tup_)  
    item_ = list_[0] + list_[1] + list_[2] + list_[3]
    list_.append(item_)
    OUTPUTS.append(tuple(list_))

ĐẦU RA là những gì bạn mong muốn

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.