当前,我有一个嵌套元组:
t = (('b', 2), ('a', 1), ('c', 3))
我希望传递两个参数key
和value
,如果它们不在嵌套元组中,则像这样(key, value)
将其添加到元组中,并返回新的元组。
如果键在元组中,则只需替换它即可。
例如:
使用嵌套元组t
,我想传入key = d
和value = 4
。因为元组不在嵌套元组中,所以它将被添加到嵌套元组中。
预期输出为:(('b', 2), ('a', 1), ('c', 3), ('d', 4))
如果元组已经在嵌套元组中,则将其替换。例如,如果我将key = c
和value = 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)
答案 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。