2016-01-13 42 views
5

Tôi đã cố xóa nhiều từ điển trong một danh sách nhưng tôi chỉ có thể xóa một từ điển một lần.Xóa nhiều từ điển trong danh sách

Dưới đây là mã chính tôi đang làm việc. Bản ghi là danh sách từ điển. Tôi muốn xóa từ điển có 0 từ điển.

Records = [{'Name':'Kelvin','Price': 0},{'Name': 'Michael','Price':10}] 

Tôi muốn xóa từ điển với Giá 0

def deleteUnsold(self): 
    for d in records: 
     for key, value in d.items(): 
      if d['Price'] == 0: 
       records.remove(d) 
+1

gì cho vòng lặp 'cho khóa, giá trị trong d.items() 'làm gì? – MrHug

+0

ý nghĩa của nó để lặp qua các khóa và giá trị trong từ điển @MrHug – MrKay

+0

Tôi có thể thấy điều đó, nhưng bạn không sử dụng 'khóa' hay' giá trị' trong phần bên trong của 'for-loop', làm cho vòng lặp trở nên vô dụng;) – MrHug

Trả lời

11

Sử dụng một list comprehension với một điều kiện if

>>> Records = [{'Name':'Kelvin','Price': 0},{'Name': 'Michael','Price':10}] 
>>> [i for i in Records if i['Price'] != 0] 
[{'Price': 10, 'Name': 'Michael'}] 

Check-out if/else in Python's list comprehension? để tìm hiểu thêm về cách sử dụng có điều kiện trong danh sách hiểu.


Lưu ý rằng [như đã đề cập below] bạn cũng có thể bỏ qua việc kiểm tra giá trị 0. Tuy nhiên điều này cũng làm việc nếu PriceNone, do đó bạn có thể sử dụng thay thế đầu tiên nếu bạn không chắc chắn về các kiểu dữ liệu của giá trị của Price

>>> [i for i in Records if i['Price']] 
[{'Price': 10, 'Name': 'Michael'}] 
+2

Bạn có thể bỏ qua phần 'không phải là 0' (và tôi đã sử dụng'! = 0' thay vì, vì tôi tin tưởng sự bình đẳng nhiều hơn tôi tin cậy số nguyên interning). – TigerhawkT3

+0

@ TigerhawkT3 Trong giây lát –

+0

Tôi không thực sự giao tiếp với khả năng hiểu danh sách. Làm cách nào để tôi thêm tuyên bố xóa? – MrKay

2

Bạn có thể sử dụng filter:

print filter(lambda x:x['Price']!=0,Records) 
+0

Tại sao lưu ý này? Nó có hoạt động không? –

+3

Nó được coi là "ít" pythonic, và danh sách nên được ưa thích. Ngoài ra hãy cẩn thận rằng bộ lọc trong python 3 trả về một trình lặp và không phải là một danh sách. – Evariste

0

Okay , nói chung bạn không nên xóa các mục khỏi danh sách bạn đang lặp lại vì điều đó có thể xảy ra khiến bạn bỏ lỡ một số mục trong danh sách.

Bây giờ, về một số câu trả lời khác được nói ở đây, có, chúng hoạt động, nhưng nói đúng là chúng không xóa/xóa các mục khỏi danh sách: chúng đang tạo danh sách mới và thay thế biến cũ bằng danh sách mới.

Điều gì có thể được thực hiện:

for d in list(records): 
    if d['Price'] == 0: 
     records.remove(d) 

for d in reversed(records): 
    if d['Price'] == 0: 
     records.remove(d) 

for idx in range(len(records)-1,-1,-1): 
    if records[idx]['Price'] == 0: 
     records.pop(idx) 

Tôi thích cái này, mặc dù:

for d in records[::-1]: 
    if d['Price'] == 0: 
     records.remove(d) 
+0

Vui lòng tham khảo hai câu trả lời đã xóa này http://i.stack.imgur.com/anHx0.png để có một cuộc thảo luận đầy đủ về giải pháp của bạn. Cảm ơn –

Các vấn đề liên quan