如果已经不在嵌套元组中,如何递归添加新元组?

时间:2019-02-12 02:33:00

标签: python tuples

当前,我有一个嵌套元组:

t = (('b', 2), ('a', 1), ('c', 3))

我希望传递两个参数keyvalue,如果它们不在嵌套元组中,则像这样(key, value)将其添加到元组中,并返回新的元组。

如果键在元组中,则只需替换它即可。


例如

使用嵌套元组t,我想传入key = dvalue = 4。因为元组不在嵌套元组中,所以它将被添加到嵌套元组中。

预期输出为:(('b', 2), ('a', 1), ('c', 3), ('d', 4))

如果元组已经在嵌套元组中,则将其替换。例如,如果我将key = cvalue = 9传递给嵌套元组t

预期输出为:(('b', 2), ('a', 1), ('c', 9))


我到目前为止所拥有的...

def add_new(t, key, value)
    if len(t) == 0:
        return (key, value)
    if key not in t[0][0] and value not in t[0][1]:
       return (key, value,) + add_new(t[0:], key, value)
    if key in t[0][0] and value in t[0][1]:
       return (key, value,) + add_new(t[1:], key, value)

add_new(t, "d", 4)
add_new(t, "c", 9)

3 个答案:

答案 0 :(得分:1)

您可以使用生成器表达式来执行此操作,以仅使用所需的值来创建新的元组,然后添加新的元组:

def add_new(t, key, value):
    return tuple(item for item in t if item[0] != key) + ((key, value),)

>> t = (('b', 2), ('a', 1), ('c', 3), ('d', 4))
>> add_new(t, 'c', 9)
(('b', 2), ('a', 1), ('d', 4), ('c', 9))

请注意((key, value),)中的多余逗号。否则,它将是单个元组,而不是嵌套元组。

答案 1 :(得分:1)

如果绝对必须使用递归,则可以将基本情况选择为空元组或第一个元素的键与key匹配的元组。在这种情况下,您将更新的密钥附加到最终结果中。否则,您将返回第一个元素,并在其余元素上递归调用add_new

这将导致以下功能:

def add_new(t, key, value):
    if len(t) == 0 or t[0][0] == key:
        return ((key, value),) + t[1:]
    return t[0:1] + add_new(t[1:], key, value) 

tup = (('b', 2), ('a', 1), ('c', 3))
print(add_new(tup, "d", 4))
print(add_new(tup, "c", 9))

输出

(('b', 2), ('a', 1), ('c', 3), ('d', 4))
(('b', 2), ('a', 1), ('c', 9))

答案 2 :(得分:0)

我认为您最好的选择是使用字典而不是元组。

t = {
      'b': 2,
      'a': 1,
      'c': 3,
    }

然后,当您要添加另一个变量时,您可以使用

t['d'] = 4

此外,当您要替换已经存在的值时,请使用

t['c'] = 9

这有几个优点。对于添加,替换和删除值,字典通常比诸如元组或列表之类的索引数据结构快得多。它们也非常直观,不需要您定义任何自己的函数或方法即可使用它们。有关Python词典的更多信息,请参见here