在忽略字符串列的同时将列表列表转换为浮点数

时间:2014-07-29 08:26:21

标签: python string list floating-point

非常类似于问题:Convert Python list of strings into floats, where list also contains words

除了我有一个2维列表(列表列表),结构是可预测的。

aa,3,250
bb,2,225
cc,4,275
dd,2.5,200

第一列总是填充字符串,应该保持不变。我试图将其余的列表转换为浮点数供以后使用。

import csv

data = open('import.csv', 'r')
catdata = csv.reader(data,delimiter=',')
cats = []
for row in catdata:
    cats.append(row)    

#trying to do the conversion here
cats = cats[:1] + [map(float, x) for x in cats[1:]]

numrowcats = len(cats)

for i in xrange(numrowcats):
    sol=cats[i][1]+cats[i][2]
    print sol

这是错误:

File "theworldneedsmorecats.py", line 12, in <module>
    cats = cats[:1] + [map(float, x) for x in cats[1:]]
ValueError: could not convert string to float: bb

好像我已成功跳过第一个字符串,它现在挂在第二个字符串“bb”上。

如果我删除转换行,我会得到:

3250
2225
4275
2.5200

问题:是否有办法调整逻辑以将数字转换为浮点数而忽略第0列中的字符串?这可以用尽可能少的开销来完成吗?由于这是导入的,是否有一种“更聪明”的方式以正确的格式导入它们?

编辑:以下作品,谢谢 -

import csv

data = open('import.csv', 'r')
catdata = csv.reader(data,delimiter=',')
cats = []
#the line below appends AND casts data from the csv
cats = [c[:1] + map(float, c[1:]) for c in catdata]

print (cats)
print cats[0][0]

和输出:

[['aa', 3.0, 250.0], ['bb', 2.0, 225.0], ['cc', 4.0, 275.0], ['dd', 2.5, 200.0]]
aa

4 个答案:

答案 0 :(得分:3)

问题是你的数组中的第一个元素不是第一列,而是第一行。这样你的行

cats = cats[:1] + [map(float, x) for x in cats[1:]]

尝试将除第一行中的元素之外的所有元素转换为float,但失败。

相反,您可以在将各行添加到catdata时进行转换。您可以在一行中将其作为列表解析来执行此操作,将此for row in catdata循环替换为:

>>> cats = [c[:1] + map(float, c[1:]) for c in catdata]
>>> print(cats)
[['aa', 3.0, 250.0],
 ['bb', 2.0, 225.0],
 ['cc', 4.0, 275.0],
 ['dd', 2.5, 200.0]]

答案 1 :(得分:0)

这就是我提出的:

import csv

data = open('import.csv', 'r')
catdata = csv.reader(data,delimiter=',')
cats = []
for row in catdata:
    cats.append(row)

catsNoFirstColumn = [cats[i][1:] for i in range(len(cats))]

catsFloat = [map(float, catsNoFirstColumn[i]) for i in range(len(catsNoFirstColumn))]

给你:

[[3.0, 250.0], [2.0, 225.0], [4.0, 275.0], [2.5, 200.0]]

答案 2 :(得分:0)

可能有像这里的代码。请注意这只适用于您的示例案例。逻辑很简单。它只引用非数字字符,然后使用csv.reader。

import csv
import StringIO
import re

convertedText = re.sub(r'([^\d,.\n]+)', r'"\1"', open("import.csv").read())
fp = StringIO.StringIO(convertedText)
reader = csv.reader(fp, delimiter=",", quoting=csv.QUOTE_NONNUMERIC)
for line in reader:
    print line

输出:

['aa', 3.0, 250.0]
['bb', 2.0, 225.0]
['cc', 4.0, 275.0]
['dd', 2.5, 200.0]

答案 3 :(得分:0)

如果你真的想要一份清单:

data=[]     
with open(fn, 'r') as fin:
    for row in csv.reader(fin):
        data.extend([[row[0]]+[float(e) for e in row[1:]]])

结果:

[['aa', 3.0, 250.0], ['bb', 2.0, 225.0], ['cc', 4.0, 275.0], ['dd', 2.5, 200.0]]

但在我看来,这些数据确实想成为一本字典:

data={}        
with open(fn, 'r') as fin:
    for row in csv.reader(fin):
        data[row[0]]=[float(e) for e in row[1:]]

数据结果如下:

{'dd': [2.5, 200.0], 'cc': [4.0, 275.0], 'bb': [2.0, 225.0], 'aa': [3.0, 250.0]}

然后你可以像这样访问元素:

>>> data['dd']
[2.5, 200.0]