Функция не добавляет элементы в пустой список

#python #python-3.x

#python #python-3.x

Вопрос:

Я написал функцию, но есть кое-что, чего я не могу понять

 def function(l1,l2):
    list1 = []
    list2 = []
    for e1 in la:
        for e2 in lb:
            if e1 < e2:
                list1.append(e1)
            elif e2 < e1:
                list2.append(e2)
    l1[:] = list1
    l2[:] = list2
  

но эта функция не дает мне никаких выходных данных.

Эта функция должна действовать следующим образом:

 function([1,2,3,4,5,6],[4,5,6,1,2,3])
l1 = [1,2,3]
l2 = [1,2,3]
  

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

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

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

1. Что должна делать ваша функция?

2. Пытался исправить отступ. Надеюсь, это не нарушило вашу первоначальную версию.

3. у вас неправильные имена в definiton — это должно быть la, lb вместо l1, l2 в def function(la, lb): . И вам нужно создать списки l1 , l2 (они могут быть даже пустыми) перед запуском function

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

5. я могу привести пример со строками:

Ответ №1:

Я предполагаю, что проблема заключается в следующем. Вам нужно присвоить список именам перед вызовом функции, чтобы у вас действительно были ссылки на список в вашей основной области. В вашем примере вы просто переопределяете l1 и l2 . Попробуй это:

 l1 = [1,2,3]
l2 = [1,2,3]
function(l1, l2)
  

Ответ №2:

Ваша функция, даже при исправлении, не выдает правильный вывод. Спросите себя: сколько раз я рассматриваю l2[0] ? Ответ: len(l1) раз! То, что вы хотите сделать, это zip объединить списки вместе, чтобы одновременно рассматривать первый элемент каждого списка, затем второй и т. Д

 def keep_lesser(l1, l2):
    la = []
    lb = []
    for a, b in zip(l1, l2):
        if a < b:
            la.append(a)
        elif b < a:
            lb.append(b)
    l1[:] = la
    l2[:] = lb
  

Эта функция ничего не возвращает, но вместо этого изменяет два списка, переданных ей в качестве входных данных.

РЕДАКТИРОВАТЬ: Пример использования

 >>first = [1,2,3,4,5,6]
>>second = [4,5,6,1,2,3]
>>keep_lesser(first, second)   <--note how this returns None
>>print(first)
[1, 2, 3]
>>print(second)
[1, 2, 3]
  

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

1. «выдает неверный вывод». — Вы имели в виду производить ? 😉

2. @leaf похоже, я даже не могу исправить предложения ‘product’

3. если я запишу это:

4. keep_lesser([‘oana’, ‘capri’,’food’], [‘too’, ‘bologna’, ‘tirreno’]) не показывает измененные списки, я не знаю почему

5. Эта функция изменяет списки, но не возвращает их. Присвоите списки переменным, затем передайте эти переменные в функцию. Функции изменят значение переменных. Когда вы вызываете ее, вы не сохраняете ссылки на списки, поэтому вы не можете видеть их после того, как они изменились

Ответ №3:

Параметрами вашей функции являются l1 и l2, а не la и lb. Вы не ввели никакого оператора return.

 def function(l1,l2):
  list1 = []
  list2 = []
  for e1 in l1:
    for e2 in l2:
        if e1 < e2:
            list1.append(e1)
        elif e2 < e1:
            list2.append(e2)
  l1[:] = list1
  l2[:] = list2
  return l1,l2
  

Наслаждайтесь!

Ответ №4:

Неясно, что вы хотите сделать — иметь функцию, которая печатает, или функцию, которая возвращает, или функцию, которая изменяет существующие списки.

Если вы хотите напечатать, то вам не хватает:

 print list1,list2
  

в конце вместо строк копирования ( [:] lines). Если вы хотите изменить списки, предоставленные функции, то то, что вы сделали, прекрасно:

 l1[:]=list1
  

обновляет список на месте, поэтому, если вы делаете:

 l1=[1,2,3,4,5,6]
l2=[4,5,6,1,2,3]
function(l1,l2)
print l1,l2
  

Вы видите результат. Если вы не выполните печать, вы не увидите результат!
Наконец, вы могли бы вернуть, поэтому вместо последних двух строк:

 return list1,list2
  

таким образом, вы можете:

 print function(1,2,3,4,5,6],[4,5,6,1,2,3])
  

Проблема вашей первой версии: вы создали два списка в функции, но ничего с ними не сделали. В любом случае вам нужна инструкция print, чтобы увидеть результаты вызова.

Обратите внимание, что вы опубликовали некоторые ошибки кодирования, проверьте другие ответы.

Ответ №5:

Как указано в других ответах, вы переключили l1 и l2 на la и lb , и вы должны передать функции два списка, ранее назначенных вместо литералов списка.

Кроме этого, ваша функция выполняет не то, что вы ожидаете, вам следует выполнить итерацию по спискам с индексом, подобным этому:

 l1 = [1,2,3,4,5,6]
l2 = [4,5,6,1,2,3]
def function(l1,l2):
    list1 = []
    list2 = []
    for i in range(len(l1)):
        e1 = l1[i]
        e2 = l2[i]
        if e1 < e2:
            list1.append(e1)
        elif e2 < e1:
            list2.append(e2)
    l1[:] = list1
    l2[:] = list2

function(l1,l2)
print l1,l2
  

Результат:

 [1, 2, 3] [1, 2, 3]
  

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

1. почему, если я хочу

2. если я напишу функцию ([‘capri’, ‘milano’, ‘genoa’], [‘roma’, ‘linate’, ‘torino’]) , почему функция не показывает мне измененные списки?

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

Ответ №6:

Я вижу какую-то ошибку в вашем коде:

 for e1 in la:
for e2 in lb:
  

Я думаю, это должно быть:

 for e1 in l1:
for e2 in l2: