Python:在元组上使用较低的函数

时间:2015-02-11 20:26:01

标签: python list tuples lowercase

我是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'

我有一种感觉,当我尝试执行数学运算时,我遇到的这个属性错误将成为一个问题。 感谢。

4 个答案:

答案 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)]