Почему использование квадратных скобок с if не дает ошибки в python

Итак, я супер нуб в программировании. Написал программу для нахождения частоты каждого элемента в массиве

print("Running own")
arr = [1, 2, 8, 3, 2, 2, 2, 5, 1];
fr = [None] * len(arr)
vsi = -1
for i in range(0, len(arr)):
    count = 1
    for j in range(i + 1, len(arr)):
        if (arr[i] == arr[j]):
            count += 1
            fr[j] = vsi
            print("j = {0} and fr[j] = {1}".format(j, fr[j]))
    if [fr[i] != vsi]:
        fr[i] = count
print(fr)

print("fr = ", fr)
print("---------------------");
print(" Element | Frequency");
print("---------------------");
for i in range(0, len(fr)):
    if (fr[i] != vsi):
        print("    " + str(arr[i]) + "    |    " + str(fr[i]));
print("---------------------")

Поэтому я использовал квадратные скобки в if, чтобы проверить, был ли посещен элемент, и присвоить count массиву частот. (Эта строка: if [fr[i] != vsi]:) После 5-часового биения головой о стену и 20-кратного отслеживания программы я понял, что компилятор трактует if как всегда true.

Почему я не получил ошибку с самого начала?

Этот литеральный список: [fr[i] != vsi] оценивается как список с одним логическим значением в нем. Когда непустой список оценивается на достоверность (например, то, что вы делаете), он будет считаться «правдивым». Если бы список был пуст, он был бы «ложным».

Paul M. 21.12.2020 11:14

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

Paul Collingwood 21.12.2020 11:16
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python.
Некоторые методы, о которых вы не знали, что они существуют в Python.
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
106
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Потому что он приводит оператор в список и выполняет логическую проверку полученного списка, поэтому, даже если внутренний элемент равен False, сам список должен возвращать True, потому что он не пуст, поэтому, даже если синтаксис действительно сбивает с толку, операторы python доступны внутри условия if, так что это допустимый синтаксис для python.

Это точно так же, как это:

a=1
b=2 
some_list = [a>b]
if some_list:
    print(f'{some_list} is Truthy')
>>>[False] is Truthy

Еще одна демонстрация:

[a>b]
Out[10]: [False]
bool([a>b])
Out[11]: True
Ответ принят как подходящий

[fr[i] != vsi ] — это список, и он верен всякий раз, когда в нем что-то есть.

Примеры:

if [0]:  #True
if [1]:  #True
if [""]: #True
if []:   #False

Список можно создать без имени?

Random Dude 21.12.2020 15:26

Другие вопросы по теме