python中的代码优化

时间:2012-04-03 04:13:06

标签: python list dictionary

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

我可以使用list comprehension或lambda将其转换为一个班轮代码吗?

我需要回答:

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

更新 - sry代码输入错误

3 个答案:

答案 0 :(得分: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]) )) )

答案 1 :(得分:1)

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

让我们尝试重写一下:

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

我不明白的是:你明白d ['ans']的价值是最后一次比较的价值吗?

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

答案 2 :(得分:1)

对于初学者来说,使用元组解包来使它更加可口。

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

然后减少循环内部:

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])}

或者,以不同的方式,或许更好的方式,

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

然而,这段代码的意图令人遗憾地难以理解。

这个值非常可疑,因为dicts的排序不是绝对的。它最终有效地基于字典的随机元素,跨Python实现和字典构造的顺序。