Actuellement, j'ai un tuple imbriqué:
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)
Je cherche à passer deux arguments key
et value
et s'ils ne sont pas dans le tuple imbriqué, ajoutez-le au tuple comme ceci (clé, valeur)
, et retournez le nouveau tuple.
Si la clé est dans le tuple, elle la remplacerait simplement.
Par exemple :
En utilisant le tuple imbriqué t
, je voudrais passer key = d
et value = 4
. Étant donné que le tuple n'est pas dans le tuple imbriqué, il serait ajouté dans le tuple imbriqué.
Le résultat attendu serait: (('b', 2), ('a', 1), ('c', 3), ('d', 4))
Si le tuple est déjà dans le tuple imbriqué, il serait remplacé. Par exemple, si je passe key = c
et value = 9
au tuple imbriqué t
La sortie attendue serait: (('b', 2), ('a', 1), ('c', 9))
Ce que je ont jusqu'à présent ...
t = (('b', 2), ('a', 1), ('c', 3))
3 Réponses :
Je pense que votre meilleur pari serait d'utiliser un dict plutôt qu'un tuple.
t['c'] = 9
Ensuite, lorsque vous souhaitez ajouter une autre variable, vous pouvez simplement utiliser
t['d'] = 4
De plus, lorsque vous souhaitez remplacer une valeur qui existe déjà, alors vous utilisez
t = { 'b': 2, 'a': 1, 'c': 3, }
Il y a plusieurs avantages à cela. Les dictionnaires sont généralement beaucoup plus rapides que les structures de données indexées comme les tuples ou les listes pour ajouter, remplacer et supprimer des valeurs. Ils sont également très intuitifs et ne nécessitent pas que vous définissiez vos propres fonctions ou méthodes pour les utiliser. Voir ici pour plus d'informations sur les dictionnaires python.
Vous pouvez le faire avec une expression de générateur pour créer un nouveau tuple avec uniquement les valeurs souhaitées, puis ajouter le nouveau tuple:
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))
Notez la virgule supplémentaire dans (( clé, valeur),)
. Sinon, ce sera un seul tuple au lieu d'un niché.
Si vous devez absolument utiliser la récursivité, vous pouvez choisir votre cas de base comme un tuple vide ou un tuple où la clé du premier élément correspond à la clé
. Dans ce cas, vous ajoutez une clé mise à jour au résultat final. Sinon, vous retournez en gardant le premier élément tel quel et en appelant récursivement add_new
sur les éléments restants.
Cela donne la fonction suivante:
(('b', 2), ('a', 1), ('c', 3), ('d', 4)) (('b', 2), ('a', 1), ('c', 9))Sortie
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))
Ceci est un
dict
.Actuellement, vous n'avez pas besoin de récursivité car la structure n'est qu'un tuple de tuples. Est-il possible qu'il puisse y avoir de nombreuses structures testées, c'est-à-dire
(('b', 2), ('a', 1), ('c', ('d', ('e', 5))))
?@ Ajax1234 Malheureusement, la mission que j'ai m'oblige à le faire de manière récursive. La structure ne sera imbriquée qu'une seule fois.