Ваше понимание списка возвращается
['Brent Park sounds pleasant', '', 'Dollis Hill sounds pleasant', 'Park Royal sounds pleasant', '']
Вы просто должны отфильтровать его:
>>> [t for t in <your list comprehension here> if t != '' ]
['Brent Park sounds pleasant', 'Dollis Hill sounds pleasant', 'Park Royal sounds pleasant']
То есть:
>>> [t for t in ('{} sounds pleasant'.format(name)
... if any(x in name for x in pleasant_sounding)
... else '{} sounds grand'.format(name)
... if any(y in name for y in royal_sounding)
... else '' for name in location_dict['Outer London']) if t != '' ]
['Brent Park sounds pleasant', 'Dollis Hill sounds pleasant', 'Park Royal sounds pleasant']
Я использовал генератор (обратите внимание на круглые скобки) для внутренней части, поскольку нам не нужно составлять список, а просто оценивать значения одно за другим.
Код все еще неясен, потому что в середине понимания списка у вас есть сложное выражение, которое создает возвращаемую строку. Вы должны использовать функцию:
>>> def text(name):
... if any(x in name for x in pleasant_sounding):
... return '{} sounds pleasant'.format(name)
... elif any(y in name for y in royal_sounding):
... return '{} sounds grand'.format(name)
... return None # None is better than '' here
...
>>> [t for t in (text(name) for name in location_dict['Outer London']) if t is not None ]
['Brent Park sounds pleasant', 'Dollis Hill sounds pleasant', 'Park Royal sounds pleasant']
Вы можете использовать более функциональный стиль, если хотите:
>>> list(filter(None, map(text, location_dict['Outer London'])))
['Brent Park sounds pleasant', 'Dollis Hill sounds pleasant', 'Park Royal sounds pleasant']
Я все еще вижу некоторую избыточность в ваших if any(name ...)
тестах. Представьте, что у вас много типов звучания: ваш код станет утомительным в обслуживании. Вы можете использовать более общий метод:
>>> soundings = [("pleasant", ['Farm', 'Park', 'Hill', 'Green']), ("grand", ['Royal', 'Queen', 'King'])}
>>> def text(name):
... for sounding_type, substrings in soundings:
... if any(x in name for x in substrings):
... return '{} sounds {}'.format(name, sounding_type)
... return None
...
>>> [t for t in (text(name) for name in location_dict['Outer London']) if t is not None]
['Brent Park sounds pleasant', 'Dollis Hill sounds pleasant', 'Park Royal sounds pleasant']
Примечание: это Python 3.7, но вы можете адаптировать его к Python 2.7 (iteritems
вместо items
).