2012-04-03 147 views
0

我正在使用python中的字典。Python中的代碼優化

s = {'k1':['aa', 'bb', 'cc', 'dd', 'ee', 'ff', 'gg']} 

我已經創建代碼:

d = {} 
for values in enumerate(s.values()[0]): 
    if values[0]<2: 
     d[values[1]] = 'True' 
    else: 
     d[values[1]] = 'False' 

我可以轉換成一個襯墊代碼使用這個列表理解或lambda?

我需要的回答:

{'aa': 'True', 'bb': 'True', 'cc': 'False', 'dd': 'False', 'ee': 'False', 'ff': 'False', 'gg': 'False'} 

更新 - SRY碼輸入錯誤

+3

你確定這段代碼正在做你想做的事嗎?當我運行它時,我得到的全部是'>>> d {'ans':'False'}' – 2012-04-03 04:24:14

+0

代碼輸入錯誤sry。其更新的 – self 2012-04-03 04:40:41

+0

這隻會存儲's.values()[0]'最後一個元素的值。沒有人明確指出這一點。你總是寫信給'd'的'ans'鍵。這個密鑰應該是一個列表嗎?你可以 – aaronasterling 2012-04-03 04:41:15

回答

7

迴應:

d = {} 
for values in enumerate(s.values()[0]): 
    if values[0]<2: 
     d['ans'] = 'True' 
    else: 
     d['ans'] = 'False' 

的一個內膽是:

d = {'ans': str(len(s.values()[0]) < 2)} 

你在做什麼是荒謬的。實質上,您發佈的代碼將始終將d['ans']設置爲'True',此時s.values()[0]的長度小於2(否則'False')。這是因爲enumerate產生的2元組中的第一個元素是索引(您正在與<2比較)。對於列表長度大於2的所有情況,else子句將繼續將其設置爲'False'。你甚至不需要這個循環。

更新: 對於您的新版本:

d = dict([(val, str(index < 2)) for (index, val) in enumerate(s.values()[0])]) 

d = dict([(i , "True") for i in li[:2]] + [(i, "False") for i in li[2:]]) 

更新2:,或者如果您想更新現有的字典:

d.update((((val, str(index < 2)) for (index, val) in enumerate(s.values()[0])))) 
+0

這正是我的觀點。 – 2012-04-03 04:32:57

+0

sry碼輸入錯誤。現在更新 – self 2012-04-03 04:39:30

+0

@preet:你的第一個更新版本是好的,但這將創建新的字典。我只是想更新現有的字典。例如,現在d = {}但是如果d = {'zz':'22'},那麼它應該更新這個字典而不是創建新的 – self 2012-04-03 04:56:23

1

哇,這是一個非常奇怪的代碼。

讓我們試着重寫了一點:

d={} 
for values in s['k1']: 
    d['ans'] = str(values[0] < 2) 

我不明白這一點是:你知道,d [「答」]將是最後的比較值的價值?

而且,說實話,我真的不知道這究竟是什麼意思。你能澄清一點嗎?

+0

sry碼輸入錯誤。現在更新 – self 2012-04-03 04:39:41

1

對於初學者來說,使用元組拆包可以讓它變得更加美味。

d = {} 
for index, value in enumerate(s.itervalues()[0]): 
    d[value] = str(index < 2) 

然後可以做一個字典解析:

d = {value: str(index < 2) for index, value in enumerate(s.itervalues()[0])} 

或者,換一個不同的,也許更好的方式

d = {} 
for index, value in enumerate(s.itervalues()[0]): 
    if index < 2: 
     d[value] = 'True' 
    else: 
     d[value] = 'False' 

隨後環路內減少,

thelist = s.itervalues()[0] 
d = {value: 'True' for value in thelist[:2]} 
d.update((value, 'False') for value in thelist[2:]) 

然而,這段代碼的意圖令人難以理解。

這個值非常值得懷疑,因爲它們的排序並不是絕對的。它最終有效地基於字典的隨機元素,跨越Python實現和字典的構建順序。