[英]Symmetric pairs from a list of words using python SET operations
我试图从我在学校的班级中找出一个问题,虽然我已经接近了最后一点逻辑逃脱了我,这是我们得到的问题:
words 参数包含两个字符单词的列表(小写,无重复)。 使用集合,找到一个 O(n) 解决方案来显示所有对称的单词对。
例如,如果单词是:[am, at, ma, if, fi],我们将显示:
我和妈妈
如果&fi
显示顺序无关紧要。 'at' 不会显示,因为 'ta' 不在单词列表中。
我已经编写了一些让我每天接近的代码 - 我最终得到了一个看起来像正确的“集合”,它为我提供了需要变成对的元素。
def find_pairs(words):
reverseWords = []
for i in words:
reverseWords.append(i[::-1])
s1 = set(words)
# reverse the list
s2 = set(reverseWords)
s3= set()
# do an intersection to find matching pairs
s3 = s1.intersection(s2)
# Display the 3 sets - original - reversed & set of what needs to be the pairs
print (s1,s2,s3)
find_pairs(["am","at","ma","if","fi"]) # ma & am, fi & if
上面的代码给出了这个结果
{'am', 'ma', 'fi', 'at', 'if'} {'am', 'ma', 'fi', 'ta', 'if'} {'ma', 'if', 'am', 'fi'}
我想不出一点逻辑可以让我把 set3 变成我需要的对称对。 或者至少 - 不使用集合操作。 他们还表示我们应该尝试以一种相当优雅的方式来做到这一点(我认为)——通过说他们想要一个 O(n) 的解决方案。 他们也几乎说过将所有内容转换为列表并在其中进行操作并不是他们想要的。 (这就是我试图做的并取得了一些成功,但后来遇到了我的解决方案,没有使用集合操作......)
任何建议将不胜感激。
通过按字母顺序创建对,您可以使用比其他答案更少的簿记来做到这一点。 例如:
def find_pairs(words):
word_set = set(words)
pairs = set()
for word in words:
rev = word[::-1]
pair = (rev, word) if rev < word else (word, rev)
if rev in word_set: # sets don't take duplicates, so we do
pairs.add(pair) # not need an explicit check for pair
return pairs
这显然是线性时间,因此它满足您的要求。 我发现:
>>>find_pairs(["am", "at", "ma", "if", "fi"])
{('am', 'ma'), ('fi', 'if')}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.