понимание понимания списков и почему это не работает? [Дубликат]

Вот более современный подход:

.parent {display: flow-root;} 

Больше нет clearfixes.

p.s. Использование переполнения: скрыто; скрывает тень окна ... так же

570
задан the Tin Man 27 April 2016 в 19:41
поделиться

5 ответов

Вы можете это сделать полностью, это просто проблема с порядком:

[ unicode(x.strip()) if x is not None else '' for x in row ]

Обратите внимание, что это фактически использует другую конструкцию языка, условное выражение , которое само по себе не является часть синтаксиса понимания , в то время как if после for…in является частью понятий списка и используется для filter элементов из исходной итерации.

Условные выражения могут использоваться во всех ситуациях, когда вы хотите выбрать между двумя значениями выражения на основе некоторого условия. Это делает то же, что и трёхмерный оператор ?:, который существует на других языках . Например:

value = 123
print(value, 'is', 'even' if value % 2 == 0 else 'odd')
837
ответ дан poke 19 August 2018 в 11:48
поделиться
  • 1
    Обратите внимание, что if / else здесь является теперь «тройным оператором». синтаксис, а не синтаксис понимания списка. – Adam Vandenberg 23 November 2010 в 21:04
  • 2
    Вот почему я предпочитаю вставлять тернарный оператор в скобки, тем более ясно, что это просто нормальное выражение, а не понимание. – Jochen Ritzel 23 November 2010 в 21:16
  • 3
    Итак, трюк есть «В сжатии списков я пишу, если раньше, тогда мне тоже нужно добавить еще часть». потому что если мой l = [ 2, 3, 4, 5], тогда [x if x % 2 == 0 for x in l] даст мне ошибку, тогда как [x if x % 2 == 0 else 200 for x in l] работает. Да, я знаю, чтобы отфильтровать его, я должен написать [ x for x in l if x % 2 == 0]. Извините за беспокойство. Спасибо за Ваш ответ. – Grijesh Chauhan 29 September 2013 в 16:29
  • 4
    В документах python упоминается тройной оператор . Обратите внимание, что для этого требуется другое, или оно не работает. – naught101 8 November 2013 в 01:23
  • 5
    @Phani Да, это все еще понимание списка, только с условным выражением. – poke 23 October 2014 в 12:04

Один из способов:

def change(f):
    if f is None:
        return unicode(f.strip())
    else:
        return ''

row = [change(x) for x in row]

Хотя тогда у вас есть:

row = map(change, row)

Или вы можете использовать встроенный lambda.

35
ответ дан Adam Vandenberg 19 August 2018 в 11:48
поделиться
  • 1
    Это также хороший (возможно, только) метод, который следует использовать, когда вам нужно обрабатывать возможные исключения из выражения if или кода в его или блоке оператора else s. Принятый ответ лучше для простых случаев. – martineau 23 November 2010 в 22:05
  • 2
    Это гораздо легче читать, чем использовать его в понимании списка. – Martin Thoma 23 March 2016 в 09:40

Вот еще один иллюстративный пример:

>>> print(", ".join(["ha" if i else "Ha" for i in range(3)]) + "!")
Ha, ha, ha!

Он использует тот факт, что if i оценивает False для 0 и True для всех других значений, генерируемых функцией range(). Поэтому понимание списка оценивается следующим образом:

>>> ["ha" if i else "Ha" for i in range(3)]
['Ha', 'ha', 'ha']
30
ответ дан Bengt 19 August 2018 в 11:48
поделиться

Другие решения отлично подходят для одной конструкции if / else. Тем не менее, трехмерные выражения в понимании списка, возможно, трудно читать.

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

row = [None, 'This', 'is', 'a', 'filler', 'test', 'string', None]

d = {None: '', 'filler': 'manipulated'}

res = [d.get(x, x) for x in row]

print(res)

['', 'This', 'is', 'a', 'manipulated', 'test', 'string', '']
0
ответ дан jpp 19 August 2018 в 11:48
поделиться

Конкретная проблема уже решена в предыдущих ответах, поэтому я обращусь к общей идее использования условностей внутри понятий списка.

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

X = [1.5, 2.3, 4.4, 5.4, 'n', 1.5, 5.1, 'a']     # Original list

# Extract non-strings from X to new list
X_non_str = [el for el in X if not isinstance(el, str)]  # When using only 'if', put 'for' in the beginning

# Change all strings in X to 'b', preserve everything else as is
X_str_changed = ['b' if isinstance(el, str) else el for el in X]  # When using 'if' and 'else', put 'for' in the end

Обратите внимание, что в первом понимании списка для X_non_str порядок:

значение для выражения 1 , если expression2

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

value1 , если expression1 else значение2 для expression2

Мне всегда трудно помнить, что значение 1 должно быть раньше, если и значение2 должно быть после. Моя голова хочет, чтобы оба были либо до, либо после.

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

3
ответ дан Tim Skov Jacobsen 19 August 2018 в 11:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: