Python: как зациклить список и добавить в новый список - PullRequest
0 голосов
/ 09 ноября 2018

Практика моего питона.

Задача: Прокрутите список A и создайте новый список только с элементами из списка A, который находится между 0-5.

Что я здесь не так делаю

a = [100, 1, 10, 2, 3, 5, 8, 13, 21, 34, 55, 98]


def new_list(x):

    for item in range(len(x)):
        new = []

        if x[item] < 5 and x[item] > 0:
            (new.append(item))
            return new


print(new_list(a))

Я просто получаю [1] в качестве ответа.

Ответы [ 5 ]

0 голосов
/ 09 ноября 2018

Просто предложение!

  1. Пустой список находится внутри Для цикла , что означает, что новый пустой список создается на каждой итерации

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

    a = [100, 1, 10, 2, 3, 5, 8, 13, 21, 34, 55, 98]
    def new_list(x):
        new = []
        for item in range(len(x)):
            if x[item] < 5 and x[item] > 0:
                new.append(item)
        return new
    
    print(new_list(a))
    
0 голосов
/ 09 ноября 2018

Только моя рекомендация. Вы можете использовать filter () здесь вместо создания своего собственного цикла.

a = [100, 1, 10, 2, 3, 5, 8, 13, 21, 34, 55, 98]

def new_list(x, low=0, high=5):
    return filter(lambda f: f in range(low, high), x)

Фильтр возвращает новый список с элементами, передающими данный предикат, и это эквивалентно

[item for item in iterable if function(item)]

согласно документации.

1012 * Поэтому *

print new_list(a)

Результаты:

[1, 2, 3, 5]

Таким образом, вы можете проверить любые значения, такие как:

print new_list(a, 5, 10)
[5, 8]
0 голосов
/ 09 ноября 2018

Вы сбрасываете new в совершенно новый пустой список каждый раз через цикл, который отбрасывает любую работу, выполненную в предыдущих итерациях.

Кроме того, в операторе if, который вы вызываете, return, который немедленно выходит из вашей функции, поэтому вы никогда не обрабатываете остаток списка.

Вы, вероятно, хотели что-то вроде этого:

def new_list(x):
    new = []
    for item in x:
        if 0 < item < 5:
            new.append(item)
    return new
0 голосов
/ 09 ноября 2018

Три ошибки:

  1. вы восстанавливаете new с каждой итерацией цикла for.
  2. Вы должны return new, когда список будет завершен, в конце функции.
  3. Вы добавляете item, но это ваш индекс. В вашем коде вы должны добавить x[item].

Код с исправлениями:

a = [100, 1, 10, 2, 3, 5, 8, 13, 21, 34, 55, 98]

def new_list(x):
    new = []

    for item in range(len(x)):
        if x[item] < 5 and x[item] > 0:
            new.append(x[item])
    return new

print(new_list(a))

Выход:

[1, 2, 3]

Предложения:

  1. Не индексировать, перебирать элементы x напрямую (for item in x: ...).
  2. Используйте цепочечные сравнения, например, 0 < item < 5.
  3. Рассмотрим понимание списка.

Код со всеми тремя предложениями:

>>> [item for item in a if 0 < item < 5]
>>> [1, 2, 3]
0 голосов
/ 09 ноября 2018

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

Вот пример того, как должен выглядеть ваш код

a = [100, 1, 10, 2, 3, 5, 8, 13, 21, 34, 55, 98]


def new_list(x):
    new = []
    for item in range(len(x)):            

        if x[item] < 5 and x[item] > 0:
            new.append(x[item])
    return new


print new_list(a)

Вы можете достичь того же результата, используя понимание списка

def new_list(x):
    return [item for item in x if 0 < item < 5]
...