2015-11-30 2 views
3

Скажет, у меня есть массив:понимание списка против итерации. Python новичок

array=[1,0,2,3,4,0,0,5,6,0] 

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

print(list(y for y in array if y!=0) 

Я попробовал другой способ без списка понимания, и он не будет работать, кто-то может объяснить, почему?

for y in array: 
    if y!=0: 
     print(list(y)) 

Что было бы другим способом распечатать список только чисел без 0?

Редактировать: Я попытался решить эту проблему, используя цикл for, и он работает, если я делаю пустой список сверху. Это работает, но я не понимаю, почему! Но почему эта работа не работает, а другая нет? Что более эффективно, это или понимание списка с точки зрения скорости/памяти?

array=[1,0,2,3,4,0,0,5,6,0] 
list=[] 
for y in array: 
    if y!=0: 
     list.append(y) 
print(list) 
+0

Можете ли вы объяснить, почему вы считаете, что вторая версия такая же, как и первая? –

+1

'filter (lambda el: el! = 0, array)' (но ew, просто используйте '[el для el в массиве, если el! = 0]' –

+0

@RickTeachey Uh. В первой версии я увидел «для y в массиве ', так вот, как я начал вторую версию.Тогда вернусь к первой версии, я увидел' if y! = 0 ', поэтому я написал это во второй версии. И тогда оба они напечатали y! что в первой версии все преобразованное в список, а вторая версия, я пытаюсь преобразовать y в список. Но я до сих пор не понимаю, что происходит – Angular

ответ

2

Давайте хороший взгляд на то, что вы думали, был прав:

for y in array: 
    if y!=0: 
     print(list(y)) 

Так мы проходим через каждое значение в массиве. Если значение не равно нулю, мы печатаем list(y). Проблема начинается здесь. Поскольку y является целым числом, list(y) возвращает ошибку, потому что вы не можете преобразовать целое число в список. Это будет работать, если вы сделали print(y).

Но тогда возникает еще одна проблема. Если мы выводим каждый элемент списка, который не является нулем, мы получаем что-то вроде этого, потому что код будет печатать только в порядке:

1 
2 
3 
4 
5 
6 

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

array=[1,0,2,3,4,0,0,5,6,0] 
list=[] 
for y in array: 
    if y!=0: 
     list.append(y) 
print(list) 

Этот ответ сохраняет каждый y значение, которое не равно нулю в списке, а затем, наконец, выводит список.

EDIT:

Это, как работает список понимание:

Прежде всего, я не могу не заметить, что вы сделали ошибку синтаксиса. : P Ты забыл о завершающих скобках! Вот правильный код: print(list(y for y in array if y != 0)).

Прежде всего, мне нужно указать, что это НЕ СПИСОК КОМПОНЕНТОВ. Это генератор. Есть крошечная разница.

Понимание списка создает список на месте. Понимание списка выглядит следующим образом: [y for y in array if y != 0]

Генератор, который является тем, что вы использовали выше, является выражением. Это выглядит так: y for y in array if y != 0.

Таким образом, вместо использования list(y for y in array if y != 0, вы можете напрямую перейти на [y for y in array if y != 0].

Итак, теперь я объясню, как работает «понимание списка» (выражение генератора).Он начинается с циклического прохождения каждого значения array. Он проверяет, не является ли значение не равным нулю. Если это не так, он добавляет y в список вывода. Таким образом, выражение генератора совпадает с вторым рабочим кодом с циклом for, за исключением того, что python создает для вас выходной список, добавляя некоторое удобство.

+0

Wow Теперь я понял! большое спасибо! Можете ли вы также объяснить, как первый шаг работает поэтапно (понимание списка) – Angular

+0

@Angular Yep, отредактировано. –

1

При создании for цикла, все в этом цикле - ВСЁ - выполняется один раз за каждый раз через петлю. Так эта линия:

print(list(y)) 

... печатает новый list каждую поездку через петлю. В то время как в первой версии:

print(list(y for y in array if y!=0)) 

... есть только одна вещь, напечатал: результаты list() понимания.

EDIT: Если вы хотите, чтобы исправить ошибки 'int' object is not iterable во второй версии, вы можете сделать это следующим образом:

for y in array: 
    if y!=0: 
     print([y]) 

list функция требует итерацию объекта в качестве входных данных. Целое число не является итерируемым, поэтому мы окружаем его скобками, чтобы поместить его внутри list, что по сути делает то же самое. Используйте вышеприведенную версию, и вы увидите, что каждый новый новый list создается через цикл.

+0

Я пробовал это, но вывод, который я получил, был примерно таким: [[1], [2], [3], [4] , [5], [6]] Поэтому он помещает каждое число в свой собственный список = ( – Angular

+0

Это то, что он должен делать. Прочтите мой ответ еще раз: строка 'print ([y])' запускается * каждую поездку через цикл *. Таким образом, вы получите новый список с одним номером в нем (например, '[1]', '[2]' и т. д.) каждый раз. –

+0

Правда. Поскольку мы на эту тему , Если я делаю что-то вроде [0] * 4, я получаю [0,0,0,0]. Что бы я сделал, чтобы получить [0], [0], [0], [0]. – Angular

1

С вашей второй попытки у вас было list(y), где у вас должно было быть y. Поскольку y - это единый int, а не итерируемый, list(y) терпит неудачу. Это выход:

>>> array=[1,0,2,3,4,0,0,5,6,0] 
>>> print(list(y for y in array if y!=0)) 
[1, 2, 3, 4, 5, 6] 
>>> for y in array: 
    if y!=0: 
     print(list(y)) 


Traceback (most recent call last): 
    File "<pyshell#49>", line 3, in <module> 
    print(list(y)) 
TypeError: 'int' object is not iterable 
>>> for y in array: 
    if y!=0: 
     print(y) 


1 
2 
3 
4 
5 
6 

Другой способ заключается в использовании filter, например, так:

>>> print(list(filter(bool,array))) 
[1, 2, 3, 4, 5, 6] 

filter принимает функцию и итерацию, применяет функцию к каждому элементу в итерацию, и возвращает только где функция возвращает истинное значение. Поскольку bool является False, если y равно 0 (фальшивость) и True в противном случае, он отлично работает для этих целей. Тем не менее, это может быть полезно для вас, чтобы увидеть, что вы можете сделать это следующим образом:

>>> print(list(filter(lambda x:x != 0, array))) 
[1, 2, 3, 4, 5, 6] 

Я вижу, вы также интересно, почему первая версия работала.

>>> print(list(y for y in array if y!=0)) 

Здесь for y in array является генератор, особый вид объекта Python, который выплевывает одно значение каждый раз, когда вы попросите его на один, так сказать. Поэтому позвольте мне сломать это так:

print(       ) #Print 
     list(      )  #Convert iterable to list 
      for y in array    #For each y in array... 
          if y!=0  #If y is not zero... 
      y        #Include y in the iterable for list() 

Помогло ли это?

+0

О, так что y является одним int, потому что цикл for проходит через каждое число в массиве? Поэтому, когда я это делаю list (y), это не работает, потому что это базовый список (один номер), который не должен работать? – Angular

+0

Это правильно! –

+0

печать (фильтр (лямбда x: x! = 0, массив)) должна быть в порядке. – BAE

1

Если вы хотите сделать это с for петли вам нужно сделать что-то вроде этого:

nonzero = [] 
for y in array: 
    if y != 0: 
     nonzero.append(y) 
print(nonzero) 

, но в списке понимание или filter будет лучше, как с точки зрения читаемости и с точки зрения скорости ,

0

list() - это конструктор, который принимает нулевые параметры или итерируемый, например список, str или кортеж. Проблема в том, что int не является итерируемой, где в качестве понимания списка ([y для y в массиве, если y! = 0]) возвращает итерабельность и может использоваться для создания списка Python documentation.

Смежные вопросы