在列表中添加数字并将其转换为字典

时间:2013-07-31 16:23:35

标签: python

我确信这一定很简单,但我是一个蟒蛇菜鸟,所以我需要一些帮助。 我有一个列表,看起来如下:

foo = [['0.125', '0', 'able'], ['', '0.75', 'unable'], ['0', '0', 'dorsal'], ['0', '0', 'ventral'], ['0', '0', 'acroscopic']]

请注意,每个单词都有1或2个数字。我想从数字1中减去数字2,然后使用字典,即:word,number。 那么Foo看起来像这样:

foo = {'able','0.125'},{'unable', '-0.75'}...

它尝试过:

bar=[]
for a,b,c in foo:
   d=float(a)-float(b)
   bar.append((c,d))

但是我得到了错误:

ValueError: could not convert string to float: 

5 个答案:

答案 0 :(得分:3)

''无法转换为字符串。

bar = []
for a,b,c in foo:
    d = float(a or 0) - float(b or 0)
    bar.append((c,d))

然而,这不会成为字典。为此你想要:

bar = {}
for a,b,c in foo:
    d = float(a or 0)-float(b or 0)
    bar[c] = d

使用字典理解的简短方法:

bar = {sublist[2]: float(sublist[0] or 0) - float(sublist[1] or 0) for sublist in foo}

答案 1 :(得分:0)

添加条件以验证字符串是否为空,并将其转换为0

答案 2 :(得分:0)

float('')不起作用。假设在这种情况下您需要0,我建议使用辅助函数:

def safefloat(s):
    if not s: 
        return 0.0
    return float(s)

res = {}
for a, b, c in foo:
    res[c] = safefloat(a) - safefloat(b)

请注意,您可以通过理解将字典放在一行中:

res = dict((c, safefloat(a) - safefloat(b)) for a, b, c in foo)

或Python 2.7 +中的字典理解:

res = {c: safefloat(a) - safefloat(b) for a, b, c in foo}

答案 3 :(得分:0)

发生这种情况是因为在某些情况下它们是一个空字符串 你可以写

d = float(a or '0') - float(b or '0')

答案 4 :(得分:0)

>>> foo = [['0.125', '0', 'able'], ['', '0.75', 'unable'],
           ['0', '0', 'dorsal'], ['0', '0', 'ventral'],
           ['0', '0', 'acroscopic']]
>>> dict((i[2], float(i[0] or 0) - float(i[1])) for i in foo)
{'acroscopic': 0.0, 'ventral': 0.0, 'unable': -0.75, 'able': 0.125,
 'dorsal': 0.0}