我正在使用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代码输入错误
答案 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实现和字典构造的顺序。