如何更改2D列表的元素类型?

时间:2015-11-22 01:15:56

标签: python python-3.x

我有一个打开txt文件的列表。该列表是一个2D列表,如下所示:

[['25 1 100.5 2 300'], ['50 3 125.5 4 85']]

我希望子列表不是字符串而是整数(当列表中的位置不均匀时)和浮点数(当位置在列表中时均匀)。例如,我希望列表看起来像:

[[25.0, 1, 100.5, 2, 300.0], [50.0, 3, 125.5, 4, 85.0]]

到目前为止,我已经尝试了

list = [['25 1 100.5 2 300'], ['50 3 125.5 4 85']]
for x in list:
    str_to_num = x.split()

这就是我不知道如何分隔哪个元素将成为一个浮点数,哪个元素将成为一个整数。

3 个答案:

答案 0 :(得分:1)

Canceled

这会将所有数字转换为浮点数。当然,假设您只有一个字符串,每个列表都有数字。

祝你好运。

答案 1 :(得分:0)

你的问题是你的x.split()试图拆分列表而不是字符串(注意['25 1 100.5 2 300']是一个包含一个元素的列表,这是字符串'25 1 100.5 2 300')。如果子列表总是只有一个这样的字符串,则可以使用x [0] .split()来修复代码。

这是一个综合的纠正编辑,假设你想要一个int,当你可以得到它或浮动:

def to_number(num_str):
    try:
       return_value = int(num_str)
    except ValueError:
       return_value = float(num_str)
    return return_value

old_list = [['25 1 100.5 2 300'], ['50 3 125.5 4 85']]
new_list = []
for x in old_list:
   num_strs = x[0].split()
   new_list.append([to_number(_) for _ in num_strs])

答案 2 :(得分:0)

你想要一个单行吗?

In [27]: ll = [['25 1 100.5 2 300'], ['50 3 125.5 4 85']]
In [28]: [[(int(x) if i%2 else float(x)) for i,x in 
               enumerate(l[0].split())] for l in ll]
Out[28]: [[25.0, 1, 100.5, 2, 300.0], [50.0, 3, 125.5, 4, 85.0]]

如果您对int / float的区别不挑剔,可以这样做:

In [32]: [[float(x) for x in l[0].split()] for l in ll]
Out[32]: [[25.0, 1.0, 100.5, 2.0, 300.0], [50.0, 3.0, 125.5, 4.0, 85.0]]

对于许多数值运算,值是浮点1.0还是整数1并不重要。

区分int和浮点数的另一种方法是int(astr)引发错误(int('1') v int('1.23')

要使用它我必须定义一个小函数:

In [44]: def foo(astr):
    try:
        return int(astr)
    except ValueError:
        return float(astr)
   ....:     
In [45]: [[foo(x) for x in l[0].split()] for l in ll]
Out[45]: [[25, 1, 100.5, 2, 300], [50, 3, 125.5, 4, 85]]

在这种情况下,只有中间字符串显示为浮点数。