2012-04-14 38 views
8

Tôi có một số list trong khoảng 40 mục nhập. Và tôi thường xuyên muốn thêm một mục vào đầu danh sách (có id 0) và muốn delete mục nhập last (có id 40) của danh sách.Thêm mục nhập vào danh sách và xóa mục nhập đầu tiên trong Python

làm cách nào để tôi làm điều này tốt nhất?

like: (ví dụ với 5 mục)

[0] = "herp" 
    [1] = "derp" 
    [2] = "blah" 
    [3] = "what" 
    [4] = "da..." 

sau khi thêm "wuggah" và xóa cuối cùng nó phải như:

[0] = "wuggah" 
    [1] = "herp" 
    [2] = "derp" 
    [3] = "blah" 
    [4] = "what" 

hoặc nối một và xóa đầu tiên.

Và tôi không muốn kết thúc việc di chuyển chúng theo cách thủ công tất cả các mục nhập đến id tiếp theo.

+0

Tôi đề nghị bạn nghiên cứu thêm một chút trước khi đăng .. Câu trả lời là nghĩa đen trên mọi trang đầu tiên giới thiệu về danh sách. – Mellkor

+2

"Và tôi không muốn kết thúc bằng cách di chuyển chúng một cách thủ công tất cả các mục nhập vào id tiếp theo". Bên trong, một đối tượng danh sách phân bổ một danh sách lớn hơn kích thước của danh sách hiện đang được sử dụng (10 phần tử, nhưng danh sách thực sự lớn hơn rất nhiều so với danh sách đó). Vì vậy, đằng sau hiện trường nó đang làm tất cả những gì cho bạn - điều này phân bổ thời gian chạy của chèn, pop ở một vị trí cụ thể và hoạt động khác càng thấp càng tốt. http://wiki.python.org/moin/TimeComplexity – CppLearner

Trả lời

7

Sử dụng collections.deque:

>>> import collections 
>>> q = collections.deque(["herp", "derp", "blah", "what", "da.."]) 
>>> q.appendleft('wuggah') 
>>> q.pop() 
'da..' 
>>> q 
deque(['wuggah', 'herp', 'derp', 'blah', 'what']) 
+0

Cảm ơn bạn. Điều này có giống với 'myList.insert (0," wuggah ")' không? –

+2

@wagglewax Có, ngoại trừ đây là một hoạt động O (1) thay vì O (n). –

10

Sử dụng insert() để đặt một mục vào đầu danh sách:

myList.insert(0, "wuggah") 

Sử dụng pop() để loại bỏ và trả về một mục trong danh sách. Pop không có đối số bật mục cuối cùng trong danh sách

myList.pop() #removes and returns "da..." 
4

Sử dụng collections.deque

In [21]: from collections import deque 

In [22]: d = deque([], 3) 

In [24]: for c in '12345678': 
    ....:  d.appendleft(c) 
    ....:  print d 
    ....: 
deque(['1'], maxlen=3) 
deque(['2', '1'], maxlen=3) 
deque(['3', '2', '1'], maxlen=3) 
deque(['4', '3', '2'], maxlen=3) 
deque(['5', '4', '3'], maxlen=3) 
deque(['6', '5', '4'], maxlen=3) 
deque(['7', '6', '5'], maxlen=3) 
deque(['8', '7', '6'], maxlen=3) 
+1

Sử dụng độ dài tối đa là một giải pháp tốt hơn ở đây, thanh lịch hơn, nói rằng, OP muốn thêm vào khoản mục, không nối thêm nó - bạn muốn '' deque.appendleft() ''. Đã chỉnh sửa. –

1

Dưới đây là một lớp lót, nhưng nó có lẽ là không hiệu quả như một số người khác ...

myList=["wuggah"] + myList[:-1] 

Cũng lưu ý rằng nó tạo ra một danh sách mới, trong đó có thể không phải những gì bạn muốn ...

1

Một cách tiếp cận khác

L = ["herp", "derp", "blah", "what", "da..."] 

L[:0]= ["wuggah"] 
L.pop()    
Các vấn đề liên quan