我是Python的新手,我在使用列表方面遇到了麻烦。
我暴露了我的问题,正如您所看到的,我有一个具有以下结构的datos.csv文件。
1,4.0,?,?,none,?
2,2.0,3.0,?,none,?
2,2.5,2.5,?,tc,39
使用此功能我将数据存储在列表中。
def main():
lista = []
with open('datos.csv','r') as f:
for line in f:
lista.append(line.strip().split(','))
determinar_tipo(lista)
if __name__ == '__main__':
main()
到目前为止,我没有问题。 但是,当我必须确定元素的类型时,就会出现问题。
使用此代码,我可以在列中组织我的列表
for columna in itertools.izip(*lista):
此代码允许我将数据视为列,如上所示,这是我从此收到的内容的示例' for':
{'1','2','2'} {'4.0','2.0','2.5'} . . .
正如您所看到的,我的csv文件中的数据相同,但按列结构。
好的,这是我的问题。
我必须根据他们的参数确定每个列的类型,也就是说,假设第一列{' 1',' 2',' 3'},检查第一个元素,该元素是该列的类型,在这种情况下,该列的类型为int。
{' 4.0',' 2',' 2.5'}的另一个例子,我检查主要元素的类型并确定它是浮。
对于{'?','?' ,'?'}类型将是"不确定"。
然而,问题出现了标志'?',如果我得到这些符号,我必须检查列的下一个元素,它将是名为'的元素。单词',{'?',' Word',' 5'},因此列的类型为字符串。
这是我为验证它而开发的代码,但我没有完全正确地确定类型。
def determinar_tipo(lista):
b = 0
aux = []
for columna in itertools.izip(*lista):
if columna[0] != "?": #If it's a number or string I save it
aux.append(columna[0])
print columna[0]
else: #If it's '?'
if len(columna) > b:
b = b + 1
if columna[b] != "?":
aux.append(columna[b])
b = 0
else:
b = b + 1
print b
#Correct code
for x in aux:
try:
var_type = type(int(x))
except ValueError:
try:
var_type = type(float(x))
except ValueError:
var_type = type(x)
print var_type
代码的第一部分负责在另一个列表中存储元素以确定每个列的类型,而代码的第二部分负责检查前一个列表中每个元素的类型
总之,我不知道如何制作' for'返回正确的元素以正确检查列的类型。
这是我的数据的正确答案:
1 , 4.0 , ? , ? , none , ?
2 , 2.0 , 3.0 , ? , none , ?
2 , 2.5 , 2.5 , ? , tc , 39
int float float undetermined string int**
答案 0 :(得分:2)
我更改了fucntions的名字,以便更有意义:
def determinar_tipo(valor):
if valor == '?':
return 'undetermined'
try:
int(valor)
except ValueError:
pass
else:
return int
try:
float(valor)
except ValueError:
return str
else:
return float
def determinar_tipos(lista):
aux = []
for columna in itertools.izip(*lista):
i = 0
while i < len(columna) and columna[i] == '?':
i += 1
aux.append(columna[i])
for i, each in enumerate(aux):
aux[i] = determinar_tipo(each)
return aux
答案 1 :(得分:2)
我采用了这种方法。重要的部分是发电机。如果有帮助请告诉我:
import itertools
lista =[
['1','4.0','?','?','none','?'],
['2','2.0','3.0','?','none','?'],
['2','2.5','2.5','?','tc','39']
]
def columnType(column):
for val in column:
if val != '?':
try:
float(val)
if '.' in val: yield 'float'
else: yield 'int'
except ValueError:
yield 'string'
for columna in itertools.izip(*lista):
print columna, next(columnType(columna),'undetermined')
作出结果:
('1', '2', '2') int
('4.0', '2.0', '2.5') float
('?', '3.0', '2.5') float
('?', '?', '?') undetermined
('none', 'none', 'tc') string
('?', '?', '39') int
编辑:@MaartenFabré建议的替代功能:
import itertools
lista =[
['1','4.0','?','?','none','?'],
['2','2.0','3.0','?','none','?'],
['2','2.5','2.5','?','tc','39']
]
def columnType(column):
for val in column:
if val != '?':
try:
float(val)
if '.' in val: return 'float'
else: return 'int'
except ValueError:
return 'string'
return 'undetermined'
for columna in itertools.izip(*lista):
print columna, columnType(columna)