Итак, я супер нуб в программировании. Написал программу для нахождения частоты каждого элемента в массиве
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.
Почему я не получил ошибку с самого начала?
Попробуйте разбить ваши сравнения. например, есть метод, который выполняет сравнение и возвращает результат, который легче отслеживать/отлаживать
Потому что он приводит оператор в список и выполняет логическую проверку полученного списка, поэтому, даже если внутренний элемент равен 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
Список можно создать без имени?
Этот литеральный список: [fr[i] != vsi] оценивается как список с одним логическим значением в нем. Когда непустой список оценивается на достоверность (например, то, что вы делаете), он будет считаться «правдивым». Если бы список был пуст, он был бы «ложным».