Как убедиться, что список пуст

#python #arrays #list #numpy

Вопрос:

Я использую колаб. У меня есть список с этими значениями:

 cents=[[5.4, 3.9, 1.3, 0.4], [5.8, 2.6, 4.0, 1.2], [7.7, 2.8, 6.7, 2.0]]
 

Я создал этот список в своем втором блоке кода.

Теперь, углубившись в свой код, я хочу очистить этот список и изменить значения на среднее значение значений из другого списка. Вот мой код для этого:

 cents=[]
def avg_and_assign(list_1, list_2, list_3):
 alc1=np.array(list_1)
 alc2=np.array(list_2)
 alc3=np.array(list_3)
 alc1_mean=np.mean(alc1, axis=0)
 alc2_mean=np.mean(alc2, axis=0)
 alc3_mean=np.mean(alc3, axis=0)
 alc1_mean1=alc1_mean[0:4]
 alc2_mean1=alc2_mean[0:4]
 alc3_mean1=alc3_mean[0:4]
 cent1=np.ndarray.tolist(alc1_mean1)
 cent2=np.ndarray.tolist(alc2_mean1)
 cent3=np.ndarray.tolist(alc3_mean1)
 cents.append(cent1)
 cents.append(cent2)
 cents.append(cent3)
cents=[cent1,cent2,cent3]
cent_array=np.array(cents)

print(cents)

avg_and_assign(avg_list_cent1, avg_list_cent2, avg_list_cent3)

print(cents)
 

Вот мои результаты:

 [[5.4, 3.9, 1.3, 0.4], [5.8, 2.6, 4.0, 1.2], [7.7, 2.8, 6.7, 2.0]]
[[5.4, 3.9, 1.3, 0.4], [5.8, 2.6, 4.0, 1.2], [7.7, 2.8, 6.7, 2.0], [5.005999999999999, 3.4180000000000006, 1.464, 0.2439999999999999], [5.971830985915493, 2.7845070422535207, 4.50281690140845, 1.4901408450704228], [6.972413793103449, 3.0862068965517238, 5.893103448275861, 2.1310344827586207]]
 

Почему мой список центов не становится пустым, когда я назначаю его пустым? Может ли это работать только в одном блоке кода?

Моя функция может добавить среднее значение в список, но я хотел, чтобы сначала центы стали пустым списком.

Спасибо.

Комментарии:

1. cents в этой функции находится локальная переменная, не связанная с глобальной с тем же именем. Вы должны добавить return cents в конец функции, а затем выполнить cents = avg_and_assign(...) .

2. Похоже, что отступ показанного кода не соответствует вашему реальному коду. Лучше скопируйте и вставьте его непосредственно в вопрос.

Ответ №1:

Не Повторяйтесь («СУХО»). Используйте цикл для выполнения повторяющихся задач. Затем верните окончательный список вместо того, чтобы пытаться использовать глобальные значения.

 def avg_and_assign(*lists):
    cents = []
    for lst in lists:
        alc = np.array(lst)
        alc_mean = np.mean(alc, axis=0)[:4]
        cents.append( np.ndarray.tolist(alc_mean) )
    return cents

cents=[cent1,cent2,cent3]
print(cents)

cents = avg_and_assign(avg_list_cent1, avg_list_cent2, avg_list_cent3)
print(cents)
 

Мне непонятно, почему вы продолжаете конвертировать в массивы numpy и обратно. В частности, зачем возвращать список списков вместо списка ndarrays?

Комментарии:

1. Спасибо! Честно говоря, я тоже не уверен. У меня было только введение в Python, и это мое первое настоящее задание «вот некоторые данные, и вот что я хочу, чтобы вы сделали сейчас». Так что я просто пробую самые разные вещи. Но я не могу поделиться всей своей книгой colab и не хотел бы этого делать, пока не выполню задание. Кроме того, я никогда не видел списки*, используемые в функции. Что это означает?

2. Вы должны быть в состоянии понять это из контекста. Это приводит к тому, что все параметры функции объединяются в один список.

3. ДА. Так мне показалось, я просто хотел убедиться.

4. Привет. Поэтому позже у меня возникают проблемы с моим кодом, так как я его изменил. Я запускаю цикл while, и когда я попадаю в цикл while, в котором выполняется эта функция, я получаю сообщение об ошибке, что индекс списка теперь находится вне диапазона в другой функции. Нужно ли мне также изменить это на *списки?

5. Вам нужно задать новый вопрос. Мы не знаем, что у вас есть, и, конечно, мы не можем видеть ваш другой код.