Если у меня есть список переменных [A, B, C, D]. Как мне эффективно найти что равно None?

У меня есть

if None in (A, B, C, D):
    ValueError("None found.")

Но он только проверяет, есть ли в нем None, и не может найти его. Я легко могу найти его, используя цикл for, но, пожалуйста, не делайте этого ... Что мне нужно, так это

if None in (A, B, C, D):
    # Find where is None
    ValueError("None found in {?}.")
0
Nathan Explosion 9 Июл 2019 в 15:06

4 ответа

Лучший ответ

Скажем, у вас есть этот список:

x = [3, 5, None, 2, None]

Если вы хотите первый Нет:

x.index(None)  

Выходы 2, индекс первого левого None.

Если вы хотите все индексы None с:

[i for i, v in enumerate(x) if v is None]  

Выводит [2, 4], индексы всех None в списке.

7
Cihan Ceyhan 9 Июл 2019 в 12:08

Вы почти там. Используйте тот факт, что последовательности имеют метод index для поиска:

mylist = [A, B , C, D]
try:
    index = mylist.index(None)
except ValueError:
    pass
else:
    raise ValueError(f'None found in {index}')

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

names = ['A', 'B', 'C', 'D']
raise ValueError(f'None found in {names[index]}')
0
Mad Physicist 9 Июл 2019 в 12:23

Вы можете использовать индекс вместо цикла:

(A, B, C, D).index(None)


print((1, None, 2, 1).index(None))
>> 1
print((1, 2, None, 1).index(None))
>> 2
1
AK47 9 Июл 2019 в 12:08

Вы можете сделать это также с пониманием списка:

data = [3, 1, 2, None, 2, None]

print ([i for i in range(len(data)) if data[i]==None])

Выход:

[3, 5]
0
ncica 9 Июл 2019 в 12:11