2015-11-06 2 views
1

Например, список содержит:Нахождение индекса элемента содержит строку в списке

  • 2 строки
  • 1 INT
  • 1 BOOL
  • 1 вложенной список

Пример:

["string1", 34, True, "string2", [2,4,6]] 

Вопрос: Как найти индекс этих двух строк в списке? (Объектные типы в списке должны быть обработаны как неизвестные)

ответ

3

Использование isinstance():

my_list = [True, 10.8, [1,2,3], False, True, "Hello", 12, "Sbioer", 2.5] 

for i, item in enumerate(my_list): 
    if isinstance(item, basestring): 
     print i 

Выход:

5 
7 

Однако, если вы хотите, чтобы проверить int, вы также получите индексы индекса типа bool, потому что (цитируя текст из другого источника):

Это совершенно логично, если бы вы были рядом, когда тип bool был , добавленный в python (иногда около 2.2 или 2.3).

Перед тем, как ввести фактический тип bool, 0 и 1 были официальным представлением для значения истины, аналогично C89. Чтобы избежать ненужного нарушения неидеального, но рабочего кода, новый тип bool должен работать так же, как 0 и 1. Это выходит за пределы значения истинности, , но все интегральные операции. Никто не рекомендовал бы использовать результат boolean в числовом контексте, равно как и большинство людей не рекомендуют тестировать равенство, чтобы определить значение истины, никто не хотел искать жесткий способ, насколько существующий код является таким. Таким образом, решение сделать Истинный и ложный маскарад как 1 и 0 соответственно. Это всего лишь исторический артефакт лингвистической эволюции .

Так что, если вы хотите проверить только int значений всего:

my_list = [True, 10.8, [1,2,3], False, True, "Hello", 12, "Sbioer", 2.5] 

for i, item in enumerate(my_list): 
    if isinstance(item, int) and not isinstance(item, bool): 
     print i 
+0

'basestring' должен использоваться в Python 2.x для включения типов' str' и 'unicode'! – cdonts

+1

Добро пожаловать! Однако это должно быть 'isinstance (item, str)' для 3.x и 'isinstance (item, basestring)' в 2.x. – cdonts

+0

спасибо, но когда l заменить str на int, а индекс за неправильный – Sbioer

-1

Вы можете сделать это с помощью type() функции. Попробуйте использовать следующий код.

l = [1,'abc', 'def', [1,2,3], True] 
    ans = [] 
    for i in range(len(l)): 
     if type(l[i]) == str: 
      ans.append(i) 

    print ans 
0

Если список назван s, то следующий будет работать:

[i for i in range(len(s)) if type(s[i]) == str] 

Если вы хотите обрабатывать Юникода строки, то вы можете изменить его на:

[i for i in range(len(s)) if isinstance(s[i], basestring)] 
0

Вы могут использовать комбинацию enumerate() и isinstance() для получения индекса строковых элементов:

l = [1, True, 'Hello', [1, 3, False, 'nested'], 'Bye'] 

for i, item in enumerate(l): 
    if isinstance(item, basestring): # Python 2. Use (str, bytes) instead of basestring for Python 3 
     print i 

Производит этот вывод:

 
2 
4 

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

Смежные вопросы