2013-05-10 81 views
0

一個新的字典,我有以下字典:創建基於舊字典

abc = {"type":"insecure","id":"1","name":"peter"} 

我想要做的是基於舊字典中沒有鑰匙「型」有一個新的字典和「ID」鍵被改變爲「身份」。新字典將如下所示:

xyz = {"identity":"1","name":"peter"} 

,我想出瞭解決辦法如下:

abc = {"type":"insecure","id":"1","name":"peter"} 
xyz = {} 
black_list_values = set(("type","id")) 
for k in abc: 
    if k not in blacklist_values: 
     xyz[k] = abc[k] 
xyz["identity"] = abc["id"] 

我在想,如果它的最快和有效的方式做到這一點?現在,「abc」只有三個值。如果「abc」大得多並且有很多值,那麼我的解決方案仍然是高效和快速的。

回答

2

您可以使用字典-理解:

abc = {"type":"insecure","id":"1","name":"peter"} 
black_list = {"type"} 
rename ={"id":"identity"} #use a mapping dictionary in case you want to rename multiple items 
dic = {rename.get(key,key) : val for key ,val in abc.items() if key not in black_list} 
print dic 

輸出:

{'name': 'peter', 'identity': '1'} 
+0

我想知道你的解決方案中的一件事。在解決方案中執行以下操作是一個好主意嗎? black_list = {「type」}不會比列表更好嗎? – hjelpmig 2013-05-10 10:52:30

+2

@ yasra002不,在列表中搜索需要'O(N)'時間,而集合需要'O(1)'時間。 – 2013-05-10 10:54:37

3

無論如何您都想創建一個新字典。可以遍歷鍵/值的字典的理解,這是更緊湊,但功能相同:

abc = {"type":"insecure","id":"1","name":"peter"} 

black_list_values = set(("type","id")) 

xyz = {k:v for k,v in abc.iteritems() if k not in black_list_values} 
xyz["identity"] = abc["id"] 
+0

謝謝你。如果我不創建一個新的字典,那麼只需修改「ABC」,那麼在這種情況下什麼是最好的選擇。我從「redis」得到「abc」,並想知道創建新字典或以某種方式修改「abc」是個好主意。下面是我如何獲得「abc」abc = redis.hgetall(「some_hash_value」) – hjelpmig 2013-05-10 10:58:20

3

沒有迭代原始字典:

abc = {"type":"insecure","id":"1","name":"peter"} 
xyz = abc.copy() 
xyz.pop('type') 
xyz['identity'] = xyz.pop('id') 
+0

重要的是要注意,'.copy()'創建原始字典的淺表副本。如果原始指向列表/字典/集合,新的指向相同的對象。 – eumiro 2013-05-10 11:06:37

+0

等等.iteritems()等方法。如果你不使用deepcopy,那麼「所有」都是淺拷貝的。 – Markon 2013-05-10 11:45:49

1

如果所有的按鍵都預先知道的,它的鍵的簡單列表,那麼顯而易見的解決方案就是

xyz = {"identity":abc["id"],"name":abc["name"]} 
0

A與其它簡單的建議是使用dict()功能:

abc = {"type":"insecure","id":"1","name":"peter"} 
xyz = dict(abc) 

然後以任何你認爲合適的方式進行更換= - )