我是 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”的元素,{“?”,“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**