0

我有一个包含字符串的列表。这些字符串是单词或整数值。例如,此列表可能如下所示:

['0', 'Negate', '-3', '2', 'SPECIALCASE', '3']

现在,根据它们的类型(整数或字符串),我想区别对待它们。但是,正如您所注意到的,我不能使用isinstace(). 我仍然可以使用type()并尝试使用该int()函数转换整数值,并将整个事物放在 try-except 方法中,以避免引发单词转换错误。但这对我来说似乎很骇人听闻。你知道处理这种情况的正确方法吗?提前致谢!

4

4 回答 4

3

我会采取不同的方法。如果您知道所有可能的“特殊”词,请检查这些词。其他所有内容都必须是 int:

keywords = {'Negate', 'SPECIALCASE'}
tmp = []
for i in lis:
    if i in keywords:
        tmp.append(i)
    else
        tmp.append(int(i))

当然,如果您想在不转换的情况下接受除整数以外的任何内容,那么尝试转换并退回到未转换的使用是要走的路。

于 2013-01-13T13:03:54.067 回答
3

“不要请求许可,请求原谅”的pythonic方式:

lst = ['0', 'Negate', '-3', '2', 'SPECIALCASE', '3']

for item in lst:
    try:
        int_number = int(item)
    except ValueError:
        # handle the special case here

请注意,如果您希望列表中只有少数项目将成为“特殊”案例项目,则应该这样做。否则按照@doomster 的建议进行检查。

于 2013-01-13T13:23:24.697 回答
0

作为参考,这是一种正则表达式方法。这可能是矫枉过正。

mylist = ['0', 'Negate', '-3', '2', 'SPECIALCASE', '3']

import re
p = re.compile(r'-?\d+')
[p.match(e) is not None for e in mylist]
# returns [True, False, True, True, False, True]

这将返回一个列表,其中包含True可选地以 a 开头的任何字符串-,然后包含一个或多个数字;False对于任何其他字符串。

或者,如果您不需要列表但只想执行不同的操作:

for item in mylist:
    if p.match(item):
        # it's a number
    else:
        # it's a string

The above works becasue None (i.e. no match) evaluates to False and anything else (when it comes to regex matches) evaluates to True. If you want to be more explicit you can use if p.match(item) is not None:.

于 2013-01-13T13:30:23.413 回答
0

You can just use type conversion to check whether it's an integer or string,

def is_integer(input):
  try:
    int(input)
    return True
  except:
    return False

for item in ['0', 'Negate', '-3', '2', 'SPECIALCASE', '3']:
  if is_integer(item):
     ...
  else:
     ...
于 2013-01-13T13:31:03.527 回答