- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试解决以下问题:
字谜是一种文字游戏,是重新排列单词或短语的字母以产生一个新单词或短语的结果,而所有原始字母恰好使用一次。例如,乐团=马车。使用http://www.puzzlers.org/pub/wordlists/unixdict.txt处的单词列表,编写一个程序,查找共享相同字符且包含最多单词的单词集。
即使只有1000字节的文件大小,它也会失败。同样,每次创建新列表时,Python为什么将旧列表保留在内存中?我收到以下错误。
l=list(map(''.join, itertools.permutations(i)))
MemoryError
import itertools
def anagram():
f=open('unixdict.txt')
f2=open('result_anagram.txt','w')
words = f.read(1000).split('\n')
for i in words:
l=[]
l=list(map(''.join, itertools.permutations(i)))
l.remove(i)
for anagram in l:
if l==i:
f2.write(i + "\n")
return True
anagram()
import itertools
def anagram():
f=open('unixdict.txt')
f2=open('result_anagram.txt','w')
words = set(line.rstrip('\n') for line in f)
for i in words:
l= map(''.join, itertools.permutations(i))
l =(x for x in l if x!=i)
for anagram in l:
if anagram in words:
f2.write(i + "\n")
return True
anagram()
最佳答案
无论您做什么,该程序都将效率极低。
但是您可以修复此MemoryError
,以便永久运行而不是失败。
首先,请注意,一个12个字母的单词具有479,001,600个排列。将所有这些存储在内存中将占用2GB以上的内存。那么,您如何解决呢?只是不要将它们全部存储在内存中。将迭代器保留为迭代器而不是创建列表,然后只需要一次容纳一个,而不是全部都适合。
这里有一个问题:您实际上是在if l==i:
行中使用该列表。但这显然是一个错误。字符串列表永远不可能等于单个字符串。您也可以用raise TypeError
替换该行,这时您可以替换整个循环,并且可以更快地失败。 :)
我认为您想要的是if anagram in words:
。在这种情况下,除了l
循环外,您不需要for
,这意味着您可以放心地将其保留为惰性迭代器:
for i in words:
l = map(''.join, itertools.permutations(i))
l = (x for x in l if x != i)
for anagram in l:
if anagram in words:
f2.write(i + "\n")
list
调用。如果您使用的是2.x,请将该
map
替换为
itertools.imap
。
f.read(1000)
通常会在结尾处得到一个额外单词的一部分,而下一个循环中将剩下的部分。尝试
readlines
。虽然没有参数没有用,但是带有参数却非常有用:
f.readlines(1000)
允许您一次读取大约1K的缓冲区,而不会出现部分行。当然,现在,不必必须在换行符上使用
split
,而必须对它们进行
rstrip
:
words = [line.rstrip('\n') for line in f.readlines(1000)]
orchestra
不会在
carthorse
附近,因此除非您记得整个文件,否则无法找到。但这应该没问题;典型的Unix字典(例如web2)大约有20万行;您可以轻松地将其读入内存,并以
set
的形式保存,而不会在2GB内存上留下任何痕迹。所以:
words = set(line.rstrip('\n') for line in f)
input
或
sys.argv[1]
)并仅输出该单词的字谜的程序。
* 200K
部分。
479M
部分。而且,您无法通过更好的数据结构来消除这种情况。相反,您必须重新考虑问题。如何在不尝试所有排列的情况下检查单词的任何排列是否与其他单词匹配?
set
。您可以使用某种多集(
collections.Counter
)作品…或者,在效率损失极小而简单性却大为提高的情况下,您可以对字母进行排序。毕竟,如果两个单词以任意顺序具有相同的字母,则当它们都进行排序时,它们的字母将具有相同的顺序。
lettersets = collections.defaultdict(set)
for word in words:
lettersets[''.join(sorted(word))].add(word)
anagrams = lettersets[''.join(sorted(word))]
for _, words in lettersets.items():
for word in words:
print('{} is an anagram of {}'.format(word, ', '.join(words - {word})))
关于python - 解决七巧板时出现内存错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25858114/
SQLite、Content provider 和 Shared Preference 之间的所有已知区别。 但我想知道什么时候需要根据情况使用 SQLite 或 Content Provider 或
警告:我正在使用一个我无法完全控制的后端,所以我正在努力解决 Backbone 中的一些注意事项,这些注意事项可能在其他地方更好地解决......不幸的是,我别无选择,只能在这里处理它们! 所以,我的
我一整天都在挣扎。我的预输入搜索表达式与远程 json 数据完美配合。但是当我尝试使用相同的 json 数据作为预取数据时,建议为空。点击第一个标志后,我收到预定义消息“无法找到任何内容...”,结果
我正在制作一个模拟 NHL 选秀彩票的程序,其中屏幕右侧应该有一个 JTextField,并且在左侧绘制弹跳的选秀球。我创建了一个名为 Ball 的类,它实现了 Runnable,并在我的主 Draf
这个问题已经有答案了: How can I calculate a time span in Java and format the output? (18 个回答) 已关闭 9 年前。 这是我的代码
我有一个 ASP.NET Web API 应用程序在我的本地 IIS 实例上运行。 Web 应用程序配置有 CORS。我调用的 Web API 方法类似于: [POST("/API/{foo}/{ba
我将用户输入的时间和日期作为: DatePicker dp = (DatePicker) findViewById(R.id.datePicker); TimePicker tp = (TimePic
放宽“邻居”的标准是否足够,或者是否有其他标准行动可以采取? 最佳答案 如果所有相邻解决方案都是 Tabu,则听起来您的 Tabu 列表的大小太长或您的释放策略太严格。一个好的 Tabu 列表长度是
我正在阅读来自 cppreference 的代码示例: #include #include #include #include template void print_queue(T& q)
我快疯了,我试图理解工具提示的行为,但没有成功。 1. 第一个问题是当我尝试通过插件(按钮 1)在点击事件中使用它时 -> 如果您转到 Fiddle,您会在“内容”内看到该函数' 每次点击都会调用该属
我在功能组件中有以下代码: const [ folder, setFolder ] = useState([]); const folderData = useContext(FolderContex
我在使用预签名网址和 AFNetworking 3.0 从 S3 获取图像时遇到问题。我可以使用 NSMutableURLRequest 和 NSURLSession 获取图像,但是当我使用 AFHT
我正在使用 Oracle ojdbc 12 和 Java 8 处理 Oracle UCP 管理器的问题。当 UCP 池启动失败时,我希望关闭它创建的连接。 当池初始化期间遇到 ORA-02391:超过
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 9 年前。 Improve
引用这个plunker: https://plnkr.co/edit/GWsbdDWVvBYNMqyxzlLY?p=preview 我在 styles.css 文件和 src/app.ts 文件中指定
为什么我的条形这么细?我尝试将宽度设置为 1,它们变得非常厚。我不知道还能尝试什么。默认厚度为 0.8,这是应该的样子吗? import matplotlib.pyplot as plt import
当我编写时,查询按预期执行: SELECT id, day2.count - day1.count AS diff FROM day1 NATURAL JOIN day2; 但我真正想要的是右连接。当
我有以下时间数据: 0 08/01/16 13:07:46,335437 1 18/02/16 08:40:40,565575 2 14/01/16 22:2
一些背景知识 -我的 NodeJS 服务器在端口 3001 上运行,我的 React 应用程序在端口 3000 上运行。我在 React 应用程序 package.json 中设置了一个代理来代理对端
我面临着一个愚蠢的问题。我试图在我的 Angular 应用程序中延迟加载我的图像,我已经尝试过这个2: 但是他们都设置了 src attr 而不是 data-src,我在这里遗漏了什么吗?保留 d
我是一名优秀的程序员,十分优秀!