开发者

How to test if every item in a list of type 'int'?

Say I have a list of numbers. How would I do to check that every item in the list 开发者_JS百科is an int?

I have searched around, but haven't been able to find anything on this.

for i in myList:
  result=isinstance(i, int)
  if result == False:
    break

would work, but looks very ugly and unpythonic in my opinion.

Is there any better(and more pythonic) way of doing this?


There are a few different ways to do it. For example, if your list includes only numbers:

>>> my_list = [1, 2, 3.25]
>>> all(isinstance(item, int) for item in my_list)
False

>>> other_list = range(3)
>>> all(isinstance(item, int) for item in other_list)
True
>>> 

Anyways, this solution doesn't work as expected if your list includes booleans, as remarked by @merlin:

>>> another_list = [1, 2,False]
>>> all(isinstance(item, int) for item in another_list)
True

If your list include booleans you should use type instead of isinstance (it' a little slower, but works as you expect):

>>> another_list = [1, 2, False]
>>> all(type(item) is int for item in another_list)
False
>>> last_list = [1, 2, 3]
>>> all(type(item) is int for item in last_list)
True


The following statement should work. It uses the any builtin and a generator expression:

any(not isinstance(x, int) for x in l)

This will return true if there is a non-int in the list. E.g.:

>>> any(not isinstance(x, int) for x in [0,12.])
True
>>> any(not isinstance(x, int) for x in [0,12])
False

The all builtin could also accomplish the same task, and some might argue it is makes slightly more sense (see Dragan's answer)

all(isinstance(x,int) for x in l)


One approach would not be to test, but to insist. This means your program can handle a broader range of inputs intelligently -- it won't fail if someone passes it a float instead.

int_list = [int(x) for x in int_list]

or (in-place):

for i, n in enumerate(int_list):
    int_list[i] = int(n)

If something can't be converted, it will throw an exception, which you can then catch if you care to.


In [1]: a = [1,2,3]

In [2]: all(type(item)==int for item in a)
Out[2]: True


See functions

def is_int(x):
    if type(x) == int:
        return True
    return


def all_int(a):
    for i in a:
        if not is_int(i):
            return False
    return True

Then call

all_int(my_list) # returns boolean


Found myself with the same question but under a different situation: If the "integers" in your list are represented as strings (e.g., as was the case for me after using 'line.split()' on a line of integers and strings while reading in a text file), and you simply want to check if the elements of the list can be represented as integers, you can use:

all(i.isdigit() for i in myList)

For example:

>>> myList=['1', '2', '3', '150', '500', '6']
>>> all(i.isdigit() for i in myList)
True

>>> myList2=['1.5', '2', '3', '150', '500', '6']
>>> all(i.isdigit() for i in myList2)
False


lst = [1,2,3]
lst2 = [1,2,'3']

list_is_int = lambda lst: [item for item in lst if isinstance(item, int)] == lst

print list_is_int(lst)
print list_is_int(lst2)

suxmac2:~$ python2.6 xx.py 
True
False

....one possible solution out of many using a list comprehension or filter()

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜