Home > Mobile >  Finding substrings that contain each other in two different lists in Pytyhon
Finding substrings that contain each other in two different lists in Pytyhon

Time:01-30

Really basic question, but I couldn't find the way to properly achieve this.

I have two lists:

vowels = ['a', 'e', 'i', 'o', 'u']

and

usernames = ['example1', 'zzzzz23', 'eeeee43', 'llllll5', 'pppapp1', 'wwsd0']

I want, to extract from usernames all elements that don't have vowels in them.

I tried:

usernames_without_vowels = []
for username in usernames:
  if str(vowels) not in username:
    usernames_without_vowels.append(username)
  else: pass
print(usernames_without_vowels)

OUTPUT 1:

>> ['example1', 'zzzzz23', 'eeeee43', 'llllll5', 'pppapp1', 'wwsd0']

As you can see, it printed the whole usernames list, as it seems to not look for substrings too.

I then tried zipping both lists as it follows:

usernames_without_vowels = []
for username,vowel in zip(usernames,vowels):
  if str(vowels) not in str(username):
    usernames_without_vowels.append(username)
  else: pass
print(usernames_without_vowels)

but, then again: OUTPUT 2:

>> ['example1', 'zzzzz23', 'eeeee43', 'llllll5', 'pppapp1']

it printed the whole usernames list EXCEPT the last value: wwsd0.

Also tried:

usernames_without_vowels = [username for username in usernames if str(vowels) not in username]
print(usernames_without_vowels)

and OUTPUT 3: >> ['example1', 'zzzzz23', 'eeeee43', 'llllll5', 'pppapp1', 'wwsd0']

I want to get all usernames in which EACH STRING of vowels is NOT present, but can't find a way.

EXPECTED OUTPUT:

>> ['zzzzz23', 'llllll5', 'wwsd0']

SOLUTION

Following @Helios solution, it was accomplished by:

username_without_vowels = [u for u in usernames if not any([v in u for v in vowels])]

Simple, and (very) effective.

Thank you for all the help!

CodePudding user response:

There are many ways to skin this cat, one way is to use set intersection and filter out all results that have results of such an intersection.

vowels = set(vowels)

[user for user in usernames if len(vowels.intersection(user)) == 0]

# OR

[user for user in usernames if not vowels.intersection(user)]

Both yield

> ['zzzzz23', 'llllll5', 'wwsd0']

CodePudding user response:

[u for u in usernames if not any(v in u for v in vowels)]

EDIT:

Updated to include @cglacet comment

  •  Tags:  
  • Related