2010-06-02 74 views
0

出一個元素我有一本字典:「切片」從Python字典

D = { "foo" : "bar", "baz" : "bip" } 

,我想創建一個具有它的元素k的一個副本新字典。所以,如果k = "baz"

R = { "baz" : "bip" } 

我現在所得到的是:

R = { k : D[k] } 

但在我的情況下k是一個複雜的表情,我已經得到了它們的整個堆棧。緩存k在臨時看起來像原始選項一樣醜陋。

我正在尋找的是一種更好(更清潔)的方式來做到這一點。

+0

你能給我們一個更具體的例子k的複雜性? – barrycarter 2010-06-02 19:10:13

+0

@barrycarter:'k'大約20-30個字符長。如果確切的形式與解決方案相關,那麼可能對我沒有興趣。 – BCS 2010-06-02 19:30:30

+0

你想在命名空間中創建單項命名的字典的「整個堆棧」?聽起來就是這個問題,你應該問一下,而不是在執行它的任何可感知的醜陋。 – 2010-06-02 21:53:50

回答

3
def take(dictionary, key): 
    return {key: dictionary[key]} 

R = take(D, k) 
+0

這是否使它更清潔?它看起來像你在做與OP相同的事情(使用相同的語法),但將它移動到其他地方並添加函數調用。 – tgray 2010-06-03 13:16:52

+0

@tgray:如果'k'是一個長表達式,它的確如此。 – liori 2010-06-03 13:28:40

0

無論如何,你將需要一套「切片」的項目。

S = set(["baz"]) 

如果設置了S的上方,你可以做一本字典的理解上d獲得R:

R = dict((k,v) for k,v in D.items() if k in S) 
+0

如果(當)我發現我有多個項目可以工作,但在這種情況下它是矯枉過正的。 – BCS 2010-06-02 19:45:11

1

你不能比你有什麼太多「乾淨」。假設你對乾淨的定義是較少的字符。

添加一個函數調用來完成這樣一個簡單的任務似乎會讓代碼混淆而不是使其更清晰。

如果您對clean的定義更具可讀性,那麼爲您的字典提供描述性名稱(以及在命名約定中遵循PEP-8)應該這樣做。

+0

在這種情況下(SO問題就是這種情況),更多的描述性名稱會混淆這個問題。在我的代碼中,他們有更多的描述性名稱。 – BCS 2010-06-02 21:38:42