元组递归列表,返回更新版本?

时间:2019-02-10 20:18:48

标签: python recursion tuples

是否可以编写一个将元组,键和值的列表作为参数传递的递归函数,然后如果键存在->设置键和值,如果没有,则在列表末尾添加新的键和值? / p>

参数必须为元组,我无法根据需要将其更改为字典等!

到目前为止,我想出的代码看起来像这样,我知道它真的很乱:

sample_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
splits = 4

def avgerage_splits(data):
    datasum = 0
    count = 0 
    for num in data:
        datasum += num
    count += 1
    if count == splits: 
        yield datasum / splits
        datasum = count = 0
if count: 
    yield datasum / count

print(list(average_splits(sample_list)))

[1.5, 3.5, 5.5, 7.5, 9.5, 11.0]

此元组列表将作为参数传递:

def change(tupl, k, v):
    if len(tupl) == 0:
        return ((k, v),)
    if len(tupl) == 1:
        if k == tupl[0][0]:
            return ((k, v),)
        else:
            return (tupl[0],) + ((k, v),)
    elif k == tupl[0][0]:
        return ((k,v),) + change(tupl[1:], k, v)
    else:
        return (tupl[0],) + change(tupl[1:], k, v)

我的两个理想结果是:

tupl = (('n', 7), ('c', 1), ('k', 13), ('z', 9))

我知道解决该问题的方法,但是我的递归还必须能够做到这一点:

print(change(tupl,'n', 111))

(('n', 111), ('c', 1), ('k', 13), ('z', 9))

问题在于,如果它是

  

print(change(tupl,'n',111))

它将返回元组列表,并在列表末尾添加不必要的('n',111)。

如果k和v在tupl中存在,则返回具有键和值更新的元组列表。如果在传递的tupl中不存在k和v,则总是在末尾添加。

我可以使用这两种解决方案中的任何一种,但是无法找出编写可以同时实现两者的递归的方法。

解决这个问题的最佳方法是什么?任何建议将不胜感激!

1 个答案:

答案 0 :(得分:1)

您可以删除一些多余或推断出的支票:

def change(tupl, k, v):
    if len(tupl) == 0:  # or just `if not tupl:`
        return ((k, v),)
    if k == tupl[0][0]:
        return ((k, v),) + tupl[1:]
    return (tupl[0],) + change(tupl[1:], k, v)

>>> tupl = (('n', 7), ('c', 1), ('k', 13), ('z', 9))
>>> print(change(tupl,'n', 111))
(('n', 111), ('c', 1), ('k', 13), ('z', 9))
>>> print(change(tupl,'m', 1))
(('n', 7), ('c', 1), ('k', 13), ('z', 9), ('m', 1))