Python 如何找到数组的类型

Python 如何找到数组的类型,python,arrays,csv,arff,Python,Arrays,Csv,Arff,我正在尝试编写一个将CSV转换为ARFF的代码。我将每个“,”之间的值导入到数组的单元格中,例如一个实例,例如: Monday,176,49,203,27,77,38,Second 转换为: ['Monday', '176', '49', '203', '27', '77', '38', 'Second'] 问题在于Python将每个单元格识别为字符串,您可以看到Python识别的类型,例如: [<type 'str'>, <type 'str'>, <type

我正在尝试编写一个将CSV转换为ARFF的代码。我将每个
“,”
之间的值导入到数组的单元格中,例如一个实例,例如:

Monday,176,49,203,27,77,38,Second
转换为:

['Monday', '176', '49', '203', '27', '77', '38', 'Second']
问题在于Python将每个单元格识别为字符串,您可以看到Python识别的类型,例如:

[<type 'str'>, <type 'str'>, <type 'str'>, <type 'str'>, <type 'str'>, <type 'str'>, <type 'str'>, <type 'str'>]
[,,,]
我正在寻找一种方法来区分名词性属性和数字属性

for i in lst:
    try:
        int(i)
        #whatever you want to do
    except ValueError:
        #error handling
这将起作用,尽管这样做会更好:

for i in lst:
    if i[-1].isdigit():  #it is a number
        #whatever
    else:
        #whatever else
取自

另见:

这将起作用,尽管这样做会更好:

for i in lst:
    if i[-1].isdigit():  #it is a number
        #whatever
    else:
        #whatever else
取自


另请参见:

如果性能在这里非常重要,我将尝试采用三步方法。这种方法不必要地避免了将字符串强制转换为
int
float
,然后通过对第一个字符进行简单检查而失败

  • 对于每个区块,检查第一个字符是否为数字
  • 如果是,首先尝试将其解析为
    int
    ,如果失败,则将其解析为
    float
  • 如果所有这些都失败了,那么你就有一个大问题:)
比如:

for chunk in chunks:
    if chunk[0].isdigit():
        try:
            return int(chunk)
        except ValueError:
            return float(chunk)
    else:
        # It's a string (a non-numeric entity)
        return chunk
当然,在text/csv文件中支持十六进制/oct文本需要更多的特殊处理,但我不认为这是一种正常情况


EDIT:想想看,它使用了类似的方法,唯一的区别是对整个字符串调用
isdigit
,而不仅仅是第一个字符。如果我们有一个长的数字序列,其中每个字符都调用
isdigit
,而我的方法总是检查第一个字符,那么这可能需要多一点时间。如果性能在这里很重要,我将尝试采用三步方法。这种方法不必要地避免了将字符串强制转换为
int
float
,然后通过对第一个字符进行简单检查而失败

  • 对于每个区块,检查第一个字符是否为数字
  • 如果是,首先尝试将其解析为
    int
    ,如果失败,则将其解析为
    float
  • 如果所有这些都失败了,那么你就有一个大问题:)
比如:

for chunk in chunks:
    if chunk[0].isdigit():
        try:
            return int(chunk)
        except ValueError:
            return float(chunk)
    else:
        # It's a string (a non-numeric entity)
        return chunk
当然,在text/csv文件中支持十六进制/oct文本需要更多的特殊处理,但我不认为这是一种正常情况


EDIT:想想看,它使用了类似的方法,唯一的区别是对整个字符串调用
isdigit
,而不仅仅是第一个字符。如果我们有很长的数字序列,其中每个字符都调用
isdigit
,而我的方法总是检查第一个字符,那么这可能需要稍长一点的时间。我能想到的最好方法是这样,使用:

>>> seq = ['Monday', '176', '49', '203', '27', '77', '38', 'Second']
>>> newseq = [converter(x) for x in seq]
>>> newseq
['Monday', 176, 49, 203, 27, 77, 38, 'Second']
>>> map(type, newseq)
[<type 'str'>, <type 'int'>, <type 'int'>, <type 'int'>, <type 'int'>, <type 'int'>, <type 'int'>, <type 'str'>]

我能想到的最好的方法是这样,使用:

>>> seq = ['Monday', '176', '49', '203', '27', '77', '38', 'Second']
>>> newseq = [converter(x) for x in seq]
>>> newseq
['Monday', 176, 49, 203, 27, 77, 38, 'Second']
>>> map(type, newseq)
[<type 'str'>, <type 'int'>, <type 'int'>, <type 'int'>, <type 'int'>, <type 'int'>, <type 'int'>, <type 'str'>]


你试过这个吗?你试过这个吗?如果需要在文本文件中支持十六进制文本、元组类型等,那么这是一个很好的解决方案,但是如果文本文件包含简单的文本和数字,那么这个解决方案就有点过于苛刻了。尽管如此,+1好吧,
isdigit
解决方案在负数或任何带有
+
的数字上都会失败,所以ISTM我们还是可以使用内置的。我可以随时更改
isdigit
来检查最后一个数字,但这总是会失败的work@Volatility:那“7-Eleven”或“Super-8”呢?@DSM:这是一个很好的观点@波动性:但现在对于短浮点文本(如
2.
结尾,但仍然是有效的浮点)来说,这将失败。但我同意,这不是一个交易破坏者,因为我们无论如何都在尝试使用
int
float
解析输入。因此,如果
float
转换失败,我们总是可以返回原始块。如果需要在文本文件中支持十六进制文字、元组类型等,这是一个很好的解决方案,但是如果文本文件包含简单的文本和数字,这会有点麻烦。尽管如此,+1好吧,
isdigit
解决方案在负数或任何带有
+
的数字上都会失败,所以ISTM我们还是可以使用内置的。我可以随时更改
isdigit
来检查最后一个数字,但这总是会失败的work@Volatility:那“7-Eleven”或“Super-8”呢?@DSM:这是一个很好的观点@波动性:但现在对于短浮点文本(如
2.
结尾,但仍然是有效的浮点)来说,这将失败。但我同意,这不是一个交易破坏者,因为我们无论如何都在尝试使用
int
float
解析输入。因此,如果
float
转换失败,我们总是可以返回原始块。谢谢-使用此方法,除了最后一个被识别为string@UNSWCSE
'Second'
不是字符串吗?对不起!,它被公认为number@UNSWCSE我没有这样的问题,你确定你复制了代码吗?谢谢-使用这种方法,除了最后一个被识别为string@UNSWCSE
'Second'
不是字符串吗?对不起!,它被公认为number@UNSWCSE我没有这样的问题,你确定你复制的代码是对的吗?