несколько действий в списке понимания Python - PullRequest
14 голосов
/ 07 октября 2011

Я хотел бы знать, как выполнять несколько команд в понимании списка.

Можете ли вы дать мне пример для чего-то простого, как:

[print ("bla1") and print ("bla2") for i in list]

так что для списка из 4-х длин 4 у меня будет:

bla1
bla2
bla1
bla2
bla1
bla2
bla1
bla2

Как ни странно, я не легко нашел это в документации. (Если вы видите очевидную причину, по которой я этого не сделал, и можете дать мне знать, как мне искать такие вещи, которые были бы еще лучше).

РЕДАКТИРОВАТЬ: ОК, это был очень плохой пример в соответствии с комментариями. Я заинтересован в создании нового из старого, но я чувствую, что мне нужны две команды для этого. (не простая печать, конечно). Например. У меня есть список списков, и я хочу создать список, который является результатом манипулирования этими списками.

Ответы [ 7 ]

26 голосов
/ 07 октября 2011

Не используйте списки для команд. Понятия списков предназначены для создания списков , а не для команд. Используйте простой старый цикл:

for i in list:
    print('bla1')
    print('bla2') 

Постижения списков - это удивительные удивительные вещи, полные единорогов и шоколада, но они не являются решением для всего.

13 голосов
/ 13 апреля 2017

Вы можете использовать кортеж для выполнения этой работы следующим образом:

[(print("bla1"), print("bla2")) for i in list]

это работает правильно.

2 голосов
/ 07 октября 2011
  1. Составления списков предназначены только для генерации данных в виде списков, а не для выполнения операторов (или любого другого побочного эффекта, такого как запись в файл) несколько раз. Используйте for ищите это.

  2. Предполагая, что вы хотите сгенерировать список ['bla1', 'bla2', 'bla1', ...]: Вы не можете сделать это вообще, каждая итерация помещает одно значение результата в список. Этим значением может быть сам список, но тогда у вас есть список списков.

  3. В определенных случаях, таких как ваш пример, это возможно, однако: Используйте ['bla' + str(i + 1) for x in list for i in range(2)], который перебирает range(2) для каждого x in list и, таким образом, генерирует два значения для элемента в list. (list это недопустимое имя для переменной, хотя оно уже занято встроенным.)

1 голос
/ 07 октября 2011

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

def f( element ):
    return intermediate

def g( intermediate ):
    return final

new_list = [ g(f(x)) for  x in old_list ]

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

0 голосов
/ 04 июня 2018

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

def f():
   print("bla1")
   print("bla2")

[f() for i in l]

Также может отправлять аргумент функции.

def f(i):
   print("bla1 %d" % i)
   print("bla2")

l = [5,6,7]

[f(i) for i in l]

Вывод:

bla1 5
bla2
bla1 6
bla2
bla1 7
bla2
0 голосов
/ 14 декабря 2012

Для чего это стоит, можно использовать list.append в понимании списка, чтобы создать новый список, игнорируя при этом основной вывод понимания списка. ОП упоминает список списков. Возьмем для примера:

>>> master = [range(x,x+2) for x in range(10)]
>>> master
[[0, 1], [1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [6, 7], [7, 8], [8, 9], [9, 10]]

Затем создайте новый список, манипулируя каждым подсписком (как описанный в редакторе ОП)

>>> new_list = []
>>> [[new_list.append(l[0]*l[1]),new_list.append(l[0]+l[1])] for l in master]

[[None, None], [None, None], [None, None], [None, None], [None, None], [None, None], [None, None], [None, None], [None, None], [None, None]]

>>> new_list

[0, 1, 2, 3, 6, 5, 12, 7, 20, 9, 30, 11, 42, 13, 56, 15, 72, 17, 90, 19]   

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

0 голосов
/ 07 октября 2011

Использовать понимание списков только для создания списков.В вашем примере значения вашего списка вообще не используются.

Согласно документации:
"Понимания списков предоставляют краткий способ создания списков из последовательностей."

for i in range(len(your_list)):
  print "blah1"
  print "blah2"

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

...