我想使用.replace函数来替换多个字符串.
我现在有
string.replace("condition1", "")
Run Code Online (Sandbox Code Playgroud)
但是想要有类似的东西
string.replace("condition1", "").replace("condition2", "text")
Run Code Online (Sandbox Code Playgroud)
虽然那感觉不是很好的语法
这样做的正确方法是什么?有点像grep/regex你可以做什么\1,\2并将字段替换为某些搜索字符串
假设我们要计算一些斐波那契数,以 997 为模。
因为n=500在 C++ 中我们可以运行
#include <iostream>
#include <array>
std::array<int, 2> fib(unsigned n) {
if (!n)
return {1, 1};
auto x = fib(n - 1);
return {(x[0] + x[1]) % 997, (x[0] + 2 * x[1]) % 997};
}
int main() {
std::cout << fib(500)[0];
}
Run Code Online (Sandbox Code Playgroud)
在 Python 中
def fib(n):
if n==1:
return (1, 2)
x=fib(n-1)
return ((x[0]+x[1]) % 997, (x[0]+2*x[1]) % 997)
if __name__=='__main__':
print(fib(500)[0])
Run Code Online (Sandbox Code Playgroud)
两者都可以毫无问题地找到答案 996。我们采用模数来保持合理的输出大小,并使用对来避免指数分支。
对于n=5000,C++ 代码输出 783,但 Python 会抱怨
RecursionError: …Run Code Online (Sandbox Code Playgroud) 我有一个这样的字典:
{ "id" : "abcde",
"key1" : "blah",
"key2" : "blah blah",
"nestedlist" : [
{ "id" : "qwerty",
"nestednestedlist" : [
{ "id" : "xyz",
"keyA" : "blah blah blah" },
{ "id" : "fghi",
"keyZ" : "blah blah blah" }],
"anothernestednestedlist" : [
{ "id" : "asdf",
"keyQ" : "blah blah" },
{ "id" : "yuiop",
"keyW" : "blah" }] } ] }
Run Code Online (Sandbox Code Playgroud)
基本上是具有任意深度的嵌套列表,字典和字符串的字典.
遍历此方法以提取每个"id"键的值的最佳方法是什么?我想实现相当于XPath查询,如"// id"."id"的值始终是一个字符串.
所以从我的例子来看,我需要的输出基本上是:
["abcde", "qwerty", "xyz", "fghi", "asdf", "yuiop"]
Run Code Online (Sandbox Code Playgroud)
订单并不重要.
Python中静态嵌套块的数量限制为20.也就是说,嵌套19个for循环将很好(虽然过于耗时; O(n^19)是疯狂的),但嵌套20将失败:
SyntaxError: too many statically nested blocks
Run Code Online (Sandbox Code Playgroud)
有这样限制的根本原因是什么?有没有办法增加限额?
背景:我正在使用最小构造算法构建一个代表字典的trie.输入列表是4.3M utf-8字符串,按字典顺序排序.生成的图形是非循环的,最大深度为638个节点.我的脚本的第一行将递归限制设置为1100 sys.setrecursionlimit().
问题:我希望能够将我的trie序列化到磁盘,因此我可以将其加载到内存中而无需从头开始重建(大约22分钟).我曾经尝试都pickle.dump()和cPickle.dump(),用文本和二进制协议两种.每次,我得到一个如下所示的堆栈跟踪:
File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/pickle.py", line 649, in save_dict
self._batch_setitems(obj.iteritems())
File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/pickle.py", line 663, in _batch_setitems
save(v)
File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/pickle.py", line 725, in save_inst
save(stuff)
File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/pickle.py", line 648, in save_dict
self.memoize(obj)
RuntimeError: maximum recursion depth exceeded
Run Code Online (Sandbox Code Playgroud)
我的数据结构相对简单: trie包含对开始状态的引用,并定义了一些方法. dfa_state包含布尔字段,字符串字段和从标签到状态的字典映射.
我对内部工作原理并不十分熟悉pickle- …
编辑:问题不是如何做到 - 这已经在其他问题中讨论过 - 问题是,这是最快的方法?
我之前找到了解决方案,但我想知道最快的解决方案是什么来压缩包含其他任意长度列表的列表.
例如:
[1, 2, [3, 4, [5],[]], [6]]
Run Code Online (Sandbox Code Playgroud)
会成为:
[1,2,3,4,5,6]
Run Code Online (Sandbox Code Playgroud)
可以有无限多个级别.某些列表对象可以是字符串,不能将其展平为输出列表中的连续字符.
Python的sys模块提供了一个函数 setrecursionlimit,可以让您更改Python的最大递归限制.文档说:
最高可能的限制取决于平台.
我的问题是:在CPython下,各种平台的最高限制是多少?我想知道Linux,Mac和Windows的价值.
更新:我们可以避免"你做错了"的答案吗?我知道尝试进行非常深度的递归通常是一个坏主意.我已经考虑了我的具体情况的利弊,并决定我想这样做.
我做了一个实际测量最大递归限制的小函数:
def f(x):
r = x
try:
r = f(x+1)
except Exception as e:
print(e)
finally:
return r
Run Code Online (Sandbox Code Playgroud)
知道我期待什么我检查过:
In [28]: import sys
In [29]: sys.getrecursionlimit()
Out[29]: 1000
Run Code Online (Sandbox Code Playgroud)
然而
In [30]: f(0)
maximum recursion depth exceeded
Out[30]: 970
Run Code Online (Sandbox Code Playgroud)
数字不固定,总是在~970左右,并且在python的不同实例之间略有变化(例如从spyder到system cmd提示符).
请注意我在python3上使用ipython.
这是怎么回事?为什么实际限制我会低于sys.getrecursionlimit()价值?
python ×9
recursion ×5
algorithm ×1
c++ ×1
depth ×1
dictionary ×1
linux ×1
nested-loops ×1
optimization ×1
pickle ×1
platform ×1
replace ×1
text ×1
traversal ×1
tree ×1