2

我最近写了一个方法来循环/usr/share/dict/words并使用我的方法返回一个回文列表ispalindrome(x)这是一些代码......它有什么问题?它只会停顿 10 分钟,然后返回文件中所有单词的列表

定义反向(一):
    返回一个[::-1]

def ispalindrome(a):
    b = 反向(a)
    如果 b.lower() == a.lower():
        返回真
    别的:
        返回假

wl = open('/usr/share/dict/words', 'r')
wordlist = wl.readlines()
wl.close()
对于单词列表中的 x:
    如果不是回文(x):
        wordlist.remove(x)
打印单词表
4

5 回答 5

8
wordlist = wl.readlines()

当你这样做时,最后会有一个换行符,所以你的列表就像:

['eye\n','bye\n', 'cyc\n']

其中的元素显然不是回文。

你需要这个:

['eye','bye', 'cyc']

所以strip换行符应该没问题。

要在一行中执行此操作:

wordlist = [line.strip() for line in open('/usr/share/dict/words')]

编辑:迭代列表并修改它会导致问题。正如Matthew所指出的,使用列表理解。

于 2011-01-12T07:50:40.623 回答
3

我认为有两个问题。

首先,将所有单词读入列表有什么意义?如果是回文,为什么不依次处理每个单词并打印出来。

其次,注意空格。每个 s 的末尾都有换行符word

由于您没有识别任何回文(由于空格),您将尝试从列表中删除每个项目。当你迭代它时!

该解决方案在一秒钟内运行并识别出许多回文:

for word in open('/usr/share/dict/words', 'r'):
    word = word.strip()
    if ispalindrome(word):
        print word

编辑

也许更“pythonic”是使用生成器表达式:

def ispalindrome(a):
    return a[::-1].lower() == a.lower()

words = (word.strip() for word in open('/usr/share/dict/words', 'r'))
palindromes = (word for word in words if ispalindrome(word))
print '\n'.join(palindromes)
于 2011-01-12T07:56:37.410 回答
3

其他人已经指出了更好的解决方案。我想告诉你为什么在运行你的代码后列表不为空。由于其他答案中提到的“换行问题”,您的ispalindrome()函数将永远不会返回,因此您的代码将调用每一项。那么为什么列表最后不是空的呢?Truewordlist.remove(x)

因为您在迭代列表时正在修改列表。考虑以下:

>>> l = [1,2,3,4,5,6]
>>> for i in l:
...     l.remove(i)
...
>>> l
[2, 4, 6]

当您删除 时1,其余元素会向上移动一步,所以现在l[0]2。但是,迭代计数器已经前进,并将l[1]在下一次迭代中查看,因此删除3等等。

因此,您的代码删除了一半的条目。道德:在迭代列表时切勿修改列表(除非您确切知道自己在做什么:))。

于 2011-01-12T08:15:16.543 回答
2

它不会返回所有单词。它返回一半。这是因为您在迭代列表时正在修改列表,这是一个错误。一个更简单、更有效的解决方案是使用列表推导。你可以修改 sukhbir 来完成整个事情:

[word for word in (word.strip() for word in wl.readlines()) if ispalindrome(word)]

您也可以将其分解:

stripped = (word.strip() for word in wl.readlines())
wordlist = [word for word in stripped if ispalindrome(word)]
于 2011-01-12T07:59:09.490 回答
1

您在/usr/share/dict/words. 这意味着你永远找不到任何回文。如果您只是在找到回文时记录它们,而不是从列表中删除非回文,您将加快速度。

于 2011-01-12T07:49:40.183 回答