Search code examples
pythonlist-comprehension

Correct one-liner list comprehension


I have the following list and string:

words = ['AIBONITO', 'BICINIUM', 'LIMONIUM', 'PICKNICK', 'SILENIUM', 'TITANIUM']
letters = 'ADEOLR'

I want to delete items in the list that contain a letter in the string. The following code does just that.

code:

for letter in letters:
    for word in words:
        if letter in word:
            words.remove(word)
print(words)

output:

['BICINIUM', 'PICKNICK']

Now I would like to convert it to a one-liner. I tried to do it by using the following code:

print([words for letter in letters for word in words if letter not in word])

This gives me a list with 12 items all containing ['BICINIUM', 'PICKNICK']. What do I need to change in the one-liner to obtain the same output as the first piece of code?

I know I can add "[0]" at the end of the one-liner but that's not really clean.


Solution

  • using all allows to do that.

    words = ['AIBONITO', 'BICINIUM', 'LIMONIUM', 'PICKNICK', 'SILENIUM', 'TITANIUM']
    letters = 'ADEOLR'
    
    result = [word for word in words if all(letter not in word for letter in letters)]
    

    yields:

    ['BICINIUM', 'PICKNICK']
    

    An alternative uses a set of letters for the same result:

    letters = set('ADEOLR')
    
    result = [word for word in words if letters.isdisjoint(word)]