Python: более чистое понимание списка - PullRequest
0 голосов
/ 04 мая 2010

Есть ли более чистый способ написать это:

for w in [w for w in words if w != '']:

Я хочу перебрать словарь words, но только слова, которые != ''. Спасибо!

Ответы [ 6 ]

6 голосов
/ 04 мая 2010

Вам не нужен listcomp здесь. Просто напишите:

for w in words:
    if w != '':
        # ...
2 голосов
/ 04 мая 2010

Если вы хотите получить ключи, почему бы не попробовать:

[w for w in words if w]
1 голос
/ 04 мая 2010

Я думаю, что ваше решение ниже оптимального. Вы перебираете список words дважды - один раз в понимании списка для создания ненулевых терминов и снова в цикле для обработки. Было бы лучше, если бы вы использовали генэксп как это.

for w in (x for x in words if x): process(w)

Таким образом, genexp будет лениво возвращать список ненулевых значений.

1 голос
/ 04 мая 2010

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

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

Я бы сделал это так с генератором:

for word in (w for w in words if not w.isspace()):
    # do stuff
1 голос
/ 04 мая 2010

filter(lambda w: w != '', words) или filter(None, words)

это предложение, оно может быть не лучшим решением вашей проблемы

0 голосов
/ 04 мая 2010

Что делает тело внешнего цикла for?

Если это вызов функции, вы можете просто сделать:

[f(w) for w in words if w != '']

...