【问题标题】:List of tuples recursion, return updated version?元组递归列表,返回更新版本?
【发布时间】:2019-02-10 20:18:48
【问题描述】:

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

参数必须是元组,我不能将其更改为字典等以满足要求!

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

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,'m', 1))

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

问题是如果它的

打印(更改(tupl,'n', 111))

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

如果 k 和 v 存在于 tupl 中,则返回更新了键和值的元组列表。如果传递的 tupl 中不存在 k 和 v,则始终添加在末尾。

我可以做到这两种解决方案中的任何一种,但无法弄清楚如何编写可以同时做到这两种解决方案的递归。

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

【问题讨论】:

  • 函数是否必须是递归的?,是否有多个元组的键需要更改其值 - 或者它可以在找到它时停止?
  • 是的,它必须是递归的,并且传入的键和值总是一个!
  • print(change(tuple,'n', 111)) 导致TypeError 你的意思是print(change(tupl,'n', 111))吗?
  • 抱歉是tupl,已编辑!
  • 这是作业题吗?

标签: python recursion tuples


【解决方案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))

【讨论】:

    猜你喜欢
    • 2014-01-18
    • 2016-01-25
    • 2019-03-19
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 2020-01-22
    • 2020-02-23
    相关资源
    最近更新 更多