我正在尝试编写一个非常简单的函数来递归搜索可能嵌套的(在最极端情况下十层深度)Python字典并返回它从给定键中找到的第一个值.
我无法理解为什么我的代码不适用于嵌套字典.
def _finditem(obj, key):
if key in obj: return obj[key]
for k, v in obj.items():
if isinstance(v,dict):
_finditem(v, key)
print _finditem({"B":{"A":2}},"A")
Run Code Online (Sandbox Code Playgroud)
它回来了None.
然而,它确实可以用于_finditem({"B":1,"A":2},"A")返回2.
我确定这是一个简单的错误,但我找不到它.我觉得在标准库中已经有可能存在这样的东西了collections,但我也找不到.
我一直在做一些函数式编程并且有一个问题.也许我可能会遗漏一些东西,但有没有办法在中途停止"减少()"功能?让我说当我达到一定条件?这个想法似乎有点反功能.我没有在python或F#中看到任何这样的选项,
举个例子,假设我有一个列表,如[1,2,3,4,5].我想总结这个列表中的元素,直到总和不大于某个数字(比方说8),并以某种方式返回/标记/存储/识别我实际添加的元素数量.
如果我们以python为例,我可能会尝试类似的东西
reduce(lambda a,b : a if a + b > 8 else a + b, input)
Run Code Online (Sandbox Code Playgroud)
这给了我正确答案6,但我怎么发现我已经添加了3个元素来到这里.没有这样的反击.我不能在lambdas里面做任务.我认为F#具有相同的情况.
我知道我可以使用for循环或使用可以存储状态等的函数.但是这样做的功能方式是什么.Reduce()想要一直运行到最后,但是在这个处理线的某个地方,我们要么想要停止它(因为我们不关心处理其余的元素)或至少记下我们所在的地方停止关怀.
我需要一个Python函数iterate(f, x),它创建一个迭代器,返回值x,f(x),f(f(x)),f(f(f(x)))等(例如,Clojure的iterate).首先,我想知道:这是否已经存在于标准库的某个地方,我只是错过了它?当然,使用生成器实现起来很容易:
def iterate(f, x):
while True:
yield x
x = f(x)
Run Code Online (Sandbox Code Playgroud)
只是出于好奇:在Python中有没有更多功能性的方法来实现这一点,例如使用一些itertools或functools魔术?
在Python 3.3中,这可行
def iterate(f, x):
return accumulate(repeat(x), lambda acc, _ : f(acc))
Run Code Online (Sandbox Code Playgroud)
但看起来像是对我的虐待.我可以更好地做到这一点吗?
python iterator functional-programming generator python-itertools
我刚开始使用python,很快就想知道是否可以使用元组索引嵌套列表.就像是:elements[(1,1)]
我想要做的一个例子类似于下面的代码,我在其中保存矩阵的一些位置,我稍后需要在一个名为index的元组中访问它.
index = ( (0,0), (0,2), (2,0), (2,2) )
elements = [ [ 'a', 'b', 'c'],
[ 'c', 'd', 'e'],
[ 'f', 'g', 'h'] ]
for i in index:
print (elements [ i[0] ] [ i[1] ])
# I would like to do this:
# print(elements[i])
Run Code Online (Sandbox Code Playgroud)
这似乎是一个有用的功能.这有什么办法吗?或者也许是一个简单的选择
python ×4
dictionary ×1
f# ×1
generator ×1
iterator ×1
nested-lists ×1
recursion ×1
search ×1
tuples ×1