2013-07-15 42 views
14

Tôi có một cuốn từ điểnRemove key từ điển bằng Python trở về từ điển mới

d = {'a':1, 'b':2, 'c':3} 

tôi cần phải loại bỏ một chìa khóa, nói c và trở về từ điển mà không quan trọng mà trong một cuộc gọi chức năng

{'a':1, 'b':2} 

d.pop ('c') sẽ trả về giá trị khóa - 3 - thay vì từ điển.

tôi sẽ cần một giải pháp chức năng nếu nó tồn tại, vì điều này sẽ đi vào comprehensions

+0

'd.pop ('c') trả lại d'? –

+0

@VictorCastilloTorres, nó trả về giá trị của 'c', là 3 trong trường hợp này. – Xeos

+0

Tôi nghĩ rằng nó không phải là 'True' bởi vì trước tiên bạn loại bỏ giá trị của' c' và bây giờ 'd = {'a': 1, 'b': 2}' và nếu bạn 'return d' cái này sẽ trả về' {'a': 1, 'b': 2} ' –

Trả lời

15

Làm thế nào về điều này:

{i:d[i] for i in d if i!='c'} 

Nó được gọi là Dictionary Comprehensions và nó có sẵn từ Python 2.7.

hoặc nếu bạn đang sử dụng Python cũ hơn 2,7:

dict((i,d[i]) for i in d if i!='c') 
+0

Đúng, hoàn toàn hoạt động. Tôi đã có nó để làm việc với: 'dict (set (d.items()) - {('c', 0)})' Nhưng đó là vì tôi biết giá trị 'c' sẽ mất. Giải pháp của bạn là nhiều hơn .. toàn diện – Xeos

+0

Biến hiệu suất trên các tập dữ liệu nhỏ (những gì tôi cần để hoạt động trên) là xung quanh giống nhau. – Xeos

+0

'dict ((i, d [i]) cho i in d nếu i! = 'C')' - Brownie chỉ cho bạn vì không tạo một danh sách trung gian khác/tuple :) – haridsv

5

Tại sao không cuộn của riêng bạn? Điều này có thể sẽ nhanh hơn so với việc tạo ra một cái mới sử dụng comprehensions từ điển:

def without(d, key): 
    new_d = d.copy() 
    new_d.pop(key) 
    return new_d 
+0

Vâng, đó là một giải pháp. Không may là tôi bị mắc kẹt với các phương pháp bản địa và tôi không thể thêm bất kỳ của riêng tôi. Nhưng điều này hoàn toàn sẽ làm việc. – Xeos

+1

Chỉ vì tò mò, làm sao bạn không thể xác định được các chức năng của riêng bạn? –

+0

Đó là một bài tập tôi cần phải hoàn thành chỉ bằng cách sử dụng hiểu và các chức năng gốc, vì vậy không có mô-đun bên ngoài là tốt. – Xeos

0

này sẽ làm việc,

(lambda dict_,key_:dict_.pop(key_,True) and dict_)({1:1},1) 

EDIT này sẽ thả phím nếu tồn tại trong từ điển và sẽ trở lại vào từ điển mà không cần cặp khóa, giá trị

trong python có các hàm thay đổi đối tượng tại chỗ và trả về giá trị thay vì đối tượng thay đổi, hàm {} .pop là ví dụ.

chúng tôi có thể sử dụng hàm lambda như trong ví dụ hoặc tổng quát bên dưới (lambda func: obj: (func (obj) và False) hoặc obj) để thay đổi hành vi này và nhận được hành vi mong đợi.

+0

"Câu trả lời của bạn chắc chắn đáng để giải thích một chút. Vui lòng tham khảo http://stackoverflow.com/help/how-to-answer. Các nhận xét sẽ giúp tạo nội dung có thể tìm kiếm được. " –

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