Ответ 1
>>> 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
>>>
Скажем, у меня есть список чисел. Как я могу проверить, что каждый элемент в списке является int?
Я искал вокруг, но ничего не смог найти.
for i in myList:
result=isinstance(i, int)
if result == False:
break
будет работать, но на мой взгляд выглядит очень уродливым и бесстрашным.
Есть ли лучший (и более питонический) способ сделать это?
>>> 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
>>>
Следующее утверждение должно работать. Он использует выражение any
builtin и generator:
any(not isinstance(x, int) for x in l)
Это вернет true, если в списке есть не-int. Например:.
>>> any(not isinstance(x, int) for x in [0,12.])
True
>>> any(not isinstance(x, int) for x in [0,12])
False
Встроенная функция all
также может выполнить одну и ту же задачу, и некоторые могут утверждать, что она имеет несколько больше смысла (см. Dragan ответ)
all(isinstance(x,int) for x in l)
In [1]: a = [1,2,3]
In [2]: all(type(item)==int for item in a)
Out[2]: True
Один подход не должен был проверяться, а настаивать. Это означает, что ваша программа может обрабатывать более широкий диапазон входов разумно - это не сработает, если кто-то передаст ей поплавок.
int_list = [int(x) for x in int_list]
или (на месте):
for i, n in enumerate(int_list):
int_list[i] = int(n)
Если что-то не может быть преобразовано, оно выдает исключение, которое вы можете поймать, если хотите.
См. функции
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
Затем вызовите
all_int(my_list) # returns boolean
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
.... одно возможное решение из многих, используя понимание списка или фильтр()
Нашел себя в подобной ситуации, но в несколько другом состоянии: если "целые числа" в вашем списке представлены как строки, и вы просто хотите проверить, могут ли элементы списка быть представлены целыми числами, вы можете использовать
all(i.isdigit() for i in myList)
Например:
>>> 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
Это было для меня после использования line.split() в строке целых чисел в текстовом файле, который присваивал всем элементам тип 'string'.