Trong Python, làm cách nào để di chuyển một mục đến một chỉ mục xác định trong danh sách?
Trong Python, làm cách nào để di chuyển một mục đến một chỉ mục xác định trong danh sách?
Câu trả lời:
Sử dụng insert
phương pháp của một danh sách:
l = list(...)
l.insert(index, item)
Ngoài ra, bạn có thể sử dụng ký hiệu lát cắt:
l[index:index] = [item]
Nếu bạn muốn di chuyển một mục đã có trong danh sách đến vị trí được chỉ định, bạn sẽ phải xóa nó và chèn nó vào vị trí mới:
l.insert(newindex, l.pop(oldindex))
last index + 1
mà không bị lỗi. Phần tử chỉ được thêm vào danh sách trong trường hợp đó.
a.insert(99999, 1)
In [14]: a
Out[14]: [...., 1]
Một giải pháp ngắn hơn một chút, chỉ di chuyển mục đến cuối, không phải ở bất kỳ đâu là:
l += [l.pop(0)]
Ví dụ:
>>> l = [1,2,3,4,5]
>>> l += [l.pop(0)]
>>> l
[2, 3, 4, 5, 1]
l.append(l.pop(0))
. Nó chỉ dài hơn một chút, nhưng nó dễ đọc hơn nhiều.
Nếu bạn không biết vị trí của mục, trước tiên bạn có thể cần tìm chỉ mục:
old_index = list1.index(item)
sau đó di chuyển nó:
list1.insert(new_index, list1.pop(old_index))
hoặc IMHO một cách rõ ràng hơn:
try:
list1.remove(item)
list1.insert(new_index, item)
except ValueError:
pass
pass
phát biểu ý kiến của bạn ... không bao giờ ẩn các ngoại lệ - điều mặc định trong một ví dụ như thế này phải là cung cấp một câu lệnh lỗi rõ ràng hơn hoặc câu lệnh in ... raise ValueError(f'Unable to move item to {new_index}')
hoặc print(f'Moving item to {new_index} failed. List remains unchanged.')
. Có lẽ pass
sẽ ổn nếu trong một hàm được gọi try_to_move_item
hoặc một cái gì đó để nó hiểu rằng hoạt động có thể thất bại một cách âm thầm.
Một giải pháp rất đơn giản, nhưng bạn phải biết chỉ số của vị trí ban đầu và chỉ số của vị trí mới:
list1[index1],list1[index2]=list1[index2],list1[index1]
Tôi đã mô tả một số phương pháp để di chuyển một mục trong cùng một danh sách với thời gian. Dưới đây là những cái để sử dụng nếu j> i:
┌───────────┬────────────────────────┐ │ 14,4usec │ x [i: i] = x.pop (j), │ │ 14,5usec │ x [i: i] = [x.pop (j)] │ │ 15,2usec │ x.insert (i, x.pop (j)) │ └───────────┴────────────────────────┘
và đây là những cái để sử dụng nếu j <= i:
┌───────────┬──────────────────────────── │ 14,4usec │ x [i: i] = x [j] ,; del x [j] │ │ 14,4usec │ x [i: i] = [x [j]]; del x [j] │ │ 15,4usec │ x.insert (i, x [j]); del x [j] │ └───────────┴────────────────────────────
Không phải là một sự khác biệt lớn nếu bạn chỉ sử dụng nó một vài lần, nhưng nếu bạn làm những việc nặng như phân loại thủ công, điều quan trọng là phải lấy nhanh nhất. Nếu không, tôi khuyên bạn chỉ nên lấy cuốn mà bạn cho là dễ đọc nhất.