对列表内容的数学运算

时间:2011-11-18 19:21:08

标签: python

我有一个列表,它是我的代码的输出,并希望在此列表中携带更多操作。我编写了代码,将输入列表中的范围转换为具有3个选项的单个值。

newlist = [[('s', [(0.0, 0.3), (0.1, 0.8), (0.0, 1.0), (0.0, 0.0), (0.0, 0.5)]), 
            ('aa', [(0.0, 0.3), [0.1, 0.8], (0.0, 1.0), [0.0, 1.0], (0.0, 0.5)])], 
          [('m', [(0.0, 0.0), (0.0, 0.0), (0.1, 0.5), (0.0, 0.8), (0.0, 0.0)]), 
           ('ih', [(0.0, 0.0), (0.1, 0.8), (0.1, 0.5), (0.0, 0.4), (0.0, 0.0)])]] 

e = int(raw_input("\n Choose the energy level of the speaker: \n '1' for low \n '2' for normal \n '3' for high \n"))

if e == 1 :
    pList = [(i[0], [j[0] for j in i[1]]) for i in newlist]

elif e == 2:
    pList = [(i[0], [(float(j[0]) + float(j[1])) / 2.0 for j in i[1]]) for i in newlist]

elif e == 3:
    pList = [(i[0], [j[1] for j in i[1]]) for i in newlist]    

print pList

选择1输出应为as,

pList = [[('s', [(0.0, 0.1, 0.0, 0.0, 0.0)]), 
          ('aa', [(0.0, 0.1, 0.0, 0.0, 0.0)])], 
        [('m', [(0.0, 0.0, 0.1, 0.0, 0.0)]), 
         ('ih', [(0.0, 0.1, 0.1, 0.0, 0.0)])]]  

选择2输出应为

pList = [[('s', [(0.15, 0.45, 0.5, 0.0, 0.25)]), 
          ('aa', [(0.15, 0.45, 0.5, 0.5, 0.25)])], 
        [('m', [0.0, 0.0, 0.3, 0.4, 0.0)]), 
         ('ih', [(0.0, 0.45, 0.3, 0.2, 0.0)])]] 

和选择3输出应该是,

pList = [[('s', [(0.3, 0.8, 1.0, 0.0, 0.5)]), 
          ('aa', [(0.3, 0.8, 1.0, 1.0, 0.5)])], 
        [('m', [(0.0, 0.0, 0.5, 0.8, 0.0)]), 
         ('ih', [(0.0, 0.8, 0.5, 0.4, 0.0)])]] 

所有选择都没有效果。我想我的指数犯了错误。选择2给出错误,

"ValueError: invalid literal for float(): a"

谢谢。

3 个答案:

答案 0 :(得分:3)

这是一个简单的拆包更改。将for i in newlist替换为for s, i in newlist[e]

>>> newlist = [[('s', [(0.0, 0.3), (0.1, 0.8), (0.0, 1.0), (0.0, 0.0), (0.0, 0.5)]),
            ('aa', [(0.0, 0.3), [0.1, 0.8], (0.0, 1.0), [0.0, 1.0], (0.0, 0.5)])],
          [('m', [(0.0, 0.0), (0.0, 0.0), (0.1, 0.5), (0.0, 0.8), (0.0, 0.0)]),
           ('ih', [(0.0, 0.0), (0.1, 0.8), (0.1, 0.5), (0.0, 0.4), (0.0, 0.0)])]]
>>> e = 1
>>> [(s, [t[0] for t in lot]) for s, lot in newlist[e]]
[('m', [0.0, 0.0, 0.1, 0.0, 0.0]), ('ih', [0.0, 0.1, 0.1, 0.0, 0.0])]

P.S。如果您使用named tuples,这种数学分析会变得更具可读性。

答案 1 :(得分:2)

这可以解决您的问题:

print [[(j, [(float(x[0]) + float(x[1])) / 2.0 for x in e]) for j,e in i] for i in newlist]

生成的输出是:

~$ python ~/test.py 
[[('s', [0.15, 0.45, 0.5, 0.0, 0.25]), ('aa', [0.15, 0.45, 0.5, 0.5, 0.25])], [('m', [0.0, 0.0, 0.3, 0.4, 0.0]), ('ih', [0.0, 0.45, 0.3, 0.2, 0.0])]]

提示

使用import pprint;用于漂亮打印复杂数据结构的pprint.pprint

import pprint; pprint.pprint([[(j, [(float(x[0]) + float(x[1])) / 2.0 for x in e]) for j,e in i] for i in newlist])

将打印出来像

~$ python ~/test.py 
[[('s', [0.15, 0.45, 0.5, 0.0, 0.25]), ('aa', [0.15, 0.45, 0.5, 0.5, 0.25])],
 [('m', [0.0, 0.0, 0.3, 0.4, 0.0]), ('ih', [0.0, 0.45, 0.3, 0.2, 0.0])]]

答案 2 :(得分:0)

因此newlist是元组列表的列表,并且所需的输出是元组列表的列表。但是pList的表达式会生成元组列表。看起来你只需要在它周围再包含一个列表理解。