【问题标题】:isinstance not working when list is used to check in Python使用列表检查 Python 时,isinstance 不起作用
【发布时间】:2015-02-12 01:00:01
【问题描述】:

我正在尝试加载一个包含两列数据的文本文件,由制表符分隔。第一列值可以是整数或浮点数,而第二列始终是浮点数。现在,我使用isinstance 来查看我的第一列是整数还是浮点数。但是,isinstance 在使用值列表或列表的最后一个元素时似乎不起作用。这是我的代码:

time_t = []
with open(logF, 'r') as f:
    for line in f:
        data_t = line.split()
        time_t.append(data_t[0])

time_length_max = time_t[-1]
print time_length_max

if isinstance(time_length_max, (int, long)):
   print "True"
 else:
   print "False"

我得到的输出是:

10000
False

假设,我声明time_length_max = 10000,而不是time_length_max = time_t[-1],我得到:

10000
True

【问题讨论】:

  • 这看起来更像是读取文件时的转换问题,通常它以字符串的形式检索值。所以这里很可能就是这种情况

标签: python floating-point integer isinstance


【解决方案1】:

您可以按照

中的建议尝试此操作

https://stackoverflow.com/a/379966/350429

def num(s):
    try:
        return int(s)
    except ValueError:
        return float(s)

time_t = []
with open(logF, 'r') as f:
    for line in f:
        data_t = line.split()
        time_t.append(num(data_t[0]))

time_length_max = time_t[-1]
print time_length_max

if isinstance(time_length_max, (int, long)):
   print "True"
 else:
   print "False"

注意该值应该是文件中的数字,如果是空字符串则会抛出异常。

【讨论】:

  • 谢谢@adifire。您的方法效果很好。但是,当我检查整个列表时它失败了。例如,如果我使用if isinstance(time_t (int, long)),而不是if isinstance(time_length_max, (int, long)) 中的time_length_max,它会打印False,表示浮点数。但是我的time_t是一个1到10000的列表,都是整数。
  • 实际上 isinstance(time_t, (int,long)) 将返回 false 因为它是一个列表,而不是因为它是一个浮点数或任何东西。要检查整个列表,您必须检查 time_t 中各个值的类型。
【解决方案2】:

split 返回字符串。在询问它是否是整数的实例之前,您可能希望将字符串转换为整数。

>>> type('10000')
<type 'str'>
>>> type(10000)
<type 'int'>
>>> type(int('10000'))
<type 'int'>

【讨论】:

  • 谢谢@JohnMee。而int('10000') 在值为整数时有效,但在其浮动时失败。我这样做了:time_t.append(int(data_t[0]))。这适用于time_t 是整数但对于浮点值失败的情况。
猜你喜欢
  • 1970-01-01
  • 2016-12-29
  • 1970-01-01
  • 2013-12-22
  • 1970-01-01
  • 2016-08-24
  • 1970-01-01
  • 2023-02-01
  • 2021-07-25
相关资源
最近更新 更多