Проверьте список python, если какой-либо из его элементов является строковым типом

Я пытаюсь поднять TypeError, если список содержит элемент строкового типа данных, когда указан смешанный тип списка. Я смог сделать это с помощью приведенного ниже кода, но мне интересно, есть ли лучший способ добиться того же результата.

numbers = [1, "two", 3, 4, 5]
myStrList = [x for x in numbers if isinstance(x, str)]
if len(myStrList) != 0:
    raise TypeError
else:
    #do something

person Anshu    schedule 28.07.2014    source источник
comment
Что вы имеете в виду под есть ли другой способ сделать проверку, пожалуйста. Зачем тебе другой путь? С какой проблемой вы столкнулись?   -  person Mansueli    schedule 28.07.2014
comment
Связано: stackoverflow.com/q/13252333/748858   -  person mgilson    schedule 28.07.2014
comment
Просто чтобы не создавать ненужный список.....   -  person Anshu    schedule 28.07.2014


Ответы (2)


Вы можете использовать any и выражение генератора:

numbers = [1, "two", 3, 4, 5]
if any(isinstance(x, str) for x in numbers):
    raise TypeError
else:
    #do something

Помимо того, что в нем меньше кода, это решение на самом деле намного эффективнее, чем ваше текущее. Это связано с тем, что вместо создания ненужного списка он будет лениво вычислять результат и проверять только те элементы, которые необходимы.


Кроме того, если вы используете Python 2.x, возможно, лучше протестировать экземпляры basestring, а не просто str. Это позволит вам также перехватывать любые строки unicode, находящиеся внутри списка. .

person Community    schedule 28.07.2014
comment
Подождите минутку, вызов TypeError не просто лишний? Если в какой-либо момент в списке есть строка, ошибка будет возникать всякий раз, когда вы пытаетесь воздействовать на него. - person Ben; 28.07.2014
comment
@ Бен - Возможно. Но, возможно, OP хочет потерпеть неудачу раньше, если в списке будет найдена строка. Насколько нам известно, #do something может быть чем-то очень трудоемким. Похоже, ОП хочет убедиться, что список чист, прежде чем продолжить. - person ; 28.07.2014
comment
Большое спасибо! Он работает... Я использую Python 3.4. - person Anshu; 28.07.2014
comment
Тогда это должен быть отрицательный тип int, строки и целые числа - не единственные дескрипторы Python типа данных :) - person Ben; 28.07.2014
comment
К вашему сведению, я пытаюсь рассчитать среднее отклонение в остальной части моего кода. Ниже приведен полный код - person Anshu; 28.07.2014
comment
sumOfinput = 0,0 для числа в числах: sumOfinput += числовое значение = sumOfinput / len(numbers) возвращает среднее значение - person Anshu; 28.07.2014
comment
Просто хотел убедиться, что ни один из элементов списка не является строкой, прежде чем он перейдет к части расчета, поскольку у меня есть опыт работы с оператором «+», когда он не вызывал TypeError, когда я пытался добавить две строки. - person Anshu; 28.07.2014

Фильтрация списка для строк тоже работает:

L=[0, 0, 1, 2, 'a', 3, 0, 0, 'l']

if filter(lambda item: isinstance(item, str), L) != []:
  raise TypeError
else:
  #do something

Если отфильтрованный список пуст, в исходном списке нет строк.

person Robert Rodriguez    schedule 28.07.2014