Python中的代码优化

问题描述:

我正在使用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

回应:

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

哇,这是一个非常奇怪的代码。

让我们试着重写了一点:

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

我不明白这一点是:你知道,d [“答”]将是最后的比较值的价值?

而且,说实话,我真的不知道这究竟是什么意思。你能澄清一点吗?

+0

sry码输入错误。现在更新 – self 2012-04-03 04:39:41

对于初学者来说,使用元组拆包可以让它变得更加美味。

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实现和字典的构建顺序。