if u90
if u90

Reputation: 105

How to check if letters of one string are in another

I have a list L of words in alphabetical order, e.g hello = ehllo how do I check for this words "blanagrams", which are words with mostly all similar letters except 1. For example, orchestra turns into orchestre. I've only been able to think to this part. I have an idea in which you have to test every letter of the current word and see whether this corresponds, to the other and if it does, it is a blanagram and create a dictionary, but i'm struggling to put it into code

L = [list of alphabetically ordered strings]

for word in L:

     for letter in word:
        #confused at this part

Upvotes: 2

Views: 3192

Answers (3)

themistoklik
themistoklik

Reputation: 880

Steven Rumbalski's answer got me thinking and there's also another way you can do this with a Counter (+1 for use of collections and thank you for sparking my interest)

from collections import Counter
def diff_one(w,z):
    c=Counter(sorted(w+z)).values()
    c=filter(lambda x:x%2!=0,c)
    return len(c)==2

Basically all matched letters will have a counter value that will be even. So you filter those out and get left with the unmatched ones. If you have more than 2 unmatched then you have a problem.

Upvotes: 2

Tushar Jain
Tushar Jain

Reputation: 355

Assuming this is similar to the part of the ladders game commonly used in AI, and you are trying to create a graph with adjacent nodes as possible words and not a dictionary.

d = {}
# create buckets of words that differ by one letter
for word in L:
    for i in range(len(word)):
        bucket = word[:i] + '_' + word[i+1:]
        if bucket in d:
            d[bucket].append(word)
        else:
            d[bucket] = [word]

Upvotes: 0

Steven Rumbalski
Steven Rumbalski

Reputation: 45542

from collections import Counter
def same_except1(s1, s2):
    ct1, ct2 = Counter(s1), Counter(s2)
    return sum((ct1 - ct2).values()) == 1 and sum((ct2 - ct1).values()) == 1

Examples:

>>> same_except1('hello', 'hella')
True
>>> same_except1('hello', 'heela')
False
>>> same_except1('hello', 'hello')
False
>>> same_except1('hello', 'helloa')
False

Upvotes: 2

Related Questions