Вот более современный подход:
.parent {display: flow-root;}
Больше нет clearfixes.
p.s. Использование переполнения: скрыто; скрывает тень окна ... так же
Вы можете это сделать полностью, это просто проблема с порядком:
[ 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')
Один из способов:
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.
if
или кода в его или блоке оператора else
s. Принятый ответ лучше для простых случаев.
– martineau
23 November 2010 в 22:05
Вот еще один иллюстративный пример:
>>> 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']
Другие решения отлично подходят для одной конструкции 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', '']
Конкретная проблема уже решена в предыдущих ответах, поэтому я обращусь к общей идее использования условностей внутри понятий списка.
Вот пример, показывающий, как условные обозначения могут быть записаны внутри понимания списка :
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
blockquote>и в последнем понимании списка для
X_str_changed
порядок:value1 , если expression1 else значение2 для expression2
blockquote>Мне всегда трудно помнить, что значение 1 должно быть раньше, если и значение2 должно быть после. Моя голова хочет, чтобы оба были либо до, либо после.
Я предполагаю, что он создан так, потому что он похож на обычный язык, например. «Я хочу остаться внутри, если идет дождь, иначе я хочу выйти на улицу»
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