我是Python的新手并且已经查看了相当多的文档来弄清楚发生了什么,但是没有运气。
我有一个元组列表,我需要转换为小写并对列表中的所有值执行数学运算。 " E"需要成为一个" e"为了执行数学运算。
如果给定的元组列表中只有一个值,则以下方法有效:
EarthU = ['1.3719107E+11', '8.3311764E-02', '2.2719107E+11', '1.4880643E+03']
earthU = [element.lower() for element in EarthU]
earthU = [(0.3048*0.3048)*float(element) for element in earthU]
如果给定的元组列表中的每个元组都有多个值,我会尝试相同的逻辑:
EarthV = [('4.2997980E+12', '7.5608735E+13'), (1.8986931E+00', '3.0367303E+02'), ('3.4997980E+12', '7.5608735E+13'), ('-4.9202352E+04', '2.8277192E+06')]
earthV = [element.lower() for element in EarthV]
尝试将元组中的每个元素转换为小写时,我收到以下错误:
AttributeError:' tuple'对象没有属性' lower'
我有一种感觉,当我尝试执行数学运算时,我遇到的这个属性错误将成为一个问题。 感谢。
答案 0 :(得分:2)
将字符串解析为浮点数既可以使用大写字母也可以使用E' E'和小写' e'。
您的代码可以缩短为:
EarthU = ['1.3719107E+11', '8.3311764E-02', '2.2719107E+11', '1.4880643E+03']
earthU = [(0.3048*0.3048)*float(element) for element in earthU]
对于元组,你可以通过提取元组的元素来使用单个列表理解(因为元组本身不具有.lower()
方法,但其元素可以):
EarthV = [('4.2997980E+12', '7.5608735E+13'), ('1.8986931E+00', '3.0367303E+02'), ('3.4997980E+12', '7.5608735E+13'), ('-4.9202352E+04', '2.8277192E+06')]
earthV = [(float(x), float(y)) for x,y in EarthV]
如果你真的需要小写:
earthV = [(x.lower(), y.lower()) for x,y in EarthV]
此表单for x,y in EarthV
通过获取元组元素的第一部分并将其绑定到EarthV
并将元组的第二部分绑定到x
来解构y
元素。 }。
答案 1 :(得分:1)
因为它没有。您可以先遍历元组字段,然后遍历整个列表。
由于元组没有.lower
方法,因此使用嵌套列表解析来获取与原始元组列表对应的列表列表:
>>> EarthV = [('4.2997980E+12', '7.5608735E+13'), ('1.8986931E+00', '3.0367303E+02'), ('3.4997980E+12', '7.5608735E+13'), ('-4.9202352E+04', '2.8277192E+06')]
>>> [[x.lower() for x in element] for element in EarthV]
[['4.2997980e+12', '7.5608735e+13'], ['1.8986931e+00', '3.0367303e+02'], ['3.4997980e+12', '7.5608735e+13'], ['-4.9202352e+04', '2.8277192e+06']]
答案 2 :(得分:0)
也可以迭代列表作为元组的替代
EarthU = [['4.2997980E+12', '7.5608735E+13'], ['1.8986931E+00', '3.0367303E+02'], ['3.4997980E+12', '7.5608735E+13'], ['-4.9202352E+04', '2.8277192E+06']]
earthv = []
for x in EarthU:
z = []
for y in x:
y = str(y).replace('E','e')
y = (0.3048*0.3048)*float(y)
z.append(y)
earthv.append(z)
print earthv
输出:
[[399464305585.92004, 7024281332054.4], [0.17639436101702402, 28.2121476530112], [325141873585.92004, 7024281332054.4], [-4571.048075950081, 262703.709946368]]
答案 3 :(得分:0)
您收到AttributeError: 'tuple' object has no attribute 'lower'
的原因是因为您将.lower()
应用于元组而不是字符串。您需要首先迭代元组中的元素并应用.lower()
然后应用数学运算。这可以使用列表推导和生成器表达式在一行中执行,如下所示(不使用.lower()):
In [7]:
EarthV = [('4.2997980E+12', '7.5608735E+13'), ('1.8986931E+00', '3.0367303E+02'), ('3.4997980E+12', '7.5608735E+13'), ('-4.9202352E+04', '2.8277192E+06')]
earthV = [tuple((0.3048*0.3048)*float(element) for element in tple) for tple in EarthV]
print earthV
[(399464305585.92004, 7024281332054.4), (0.17639436101702402, 28.2121476530112), (325141873585.92004, 7024281332054.4), (-4571.048075950081, 262703.709946368)]