回文字典到非回文?

时间:2016-02-20 17:22:09

标签: python string dictionary palindrome

我很抱歉,如果这太容易了,但我无法弄清楚如何构建这个词典。

我有一个字符串例如

"Bob and Anna are meeting at noon"

我想要一本字典,其中所有的回文都指向以下非回文列表,所以

{"Bob": ["and"], "Anna": ["are", "meeting", "at"], "noon": []}

我发现我可以检查一个单词是否是

的回文
word.lower() == word.lower()[::-1]

我也可以用

将字符串拆分成单词
string.split()

但我不明白如何循环字符串并构建字典,以便只有回文键是键并同时列出一个列表。

感谢您的帮助

3 个答案:

答案 0 :(得分:2)

此代码应该有效:

text = "Bob and Anna are meeting at noon"
words = {}
last_p = None
for word in text.split():
    word2 = word.lower()
    if word2 == word2[::-1]:
        words[word] = []
        last_p = word
    elif last_p:
        words[last_p].append(word)
print(words)

如果在第一个回文之前的句子中有任何单词,它们将被忽略。如果您希望字典中的项目保持其原始顺序,请使用collections.OrderedDict类而不是内置dict

答案 1 :(得分:1)

def is_palindrome(word):
    return word.lower() == word.lower()[::-1]


def task(string):
    words = string.split(' ')
    returned = dict()
    i = 0
    while i < len(words):
        if is_palindrome(words[i]):  # if palindrome
            returned[words[i]] = []
            j = i + 1
            while j < len(words) and not is_palindrome(words[j]):
                returned[words[i]].append(words[j])
                j += 1
        i += 1
    return returned

print(task("Bob and Anna are meeting at noon"))

尝试了解它是如何工作的,这是你有时需要自己解决的事情之一。

另外值得一提的是,字典不是有序的,因此最终结果的对可能会有不同的排列。

答案 2 :(得分:1)

from collections import OrderedDict

s = "Bob and Anna are meeting at noon"
d = OrderedDict()
lastKey = None

for i in s.split():
  if i.upper() == i.upper()[::-1]:
    d[i] = []
    lastKey = i
  else:
    if lastKey: d[lastKey].append(i)

print d