Python ne supporte pas l'ajout d'une ligne à une liste:Pourquoi ne puis-je pas ajouter un tuple à une liste avec l'opérateur '+' dans Python?
>>> [1,2,3] + (4,5,6)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can only concatenate list (not "tuple") to list
Quels sont les inconvénients pour fournir un tel soutien dans la langue? Notez que je m'attendrais à ce que ce soit symétrique: [1, 2] + (3, 4)
et (1, 2) + [3, 4]
évalueraient tous les deux une nouvelle liste [1, 2, 3, 4]
. Mon raisonnement est qu'une fois que quelqu'un a appliqué l'opérateur + à un mélange de tuples et de listes, ils sont susceptibles de le faire à nouveau (très probablement dans la même expression), donc nous pourrions aussi fournir la liste pour éviter les conversions supplémentaires.
Voici ma motivation pour cette question.
Il arrive assez souvent que j'ai de petites collections que je préfère stocker sous forme de tuples pour éviter toute modification accidentelle et pour améliorer les performances. J'ai alors besoin de combiner ces tuples avec des listes, et d'avoir à convertir chacun d'entre eux en listes rend le code très moche. Notez que +=
ou extend
peuvent fonctionner dans des cas simples. Mais en général, quand j'ai une expression
columns = default_columns + columns_from_user + calculated_columns
Je ne sais pas lesquels d'entre eux sont des tuples et qui sont des listes. Donc, soit je dois tout convertir à des listes:
columns = list(default_columns) + list(columns_from_user) + list(calculated_columns)
Ou utiliser itertools:
columns = list(itertools.chain(default_columns, columns_from_user, calculated_columns))
Ces deux solutions sont plus laide qu'une simple somme; et le chain
peut aussi être plus lent (puisqu'il doit parcourir les entrées un élément à la fois).
Que diriez-vous simplement d'être cohérent? Utilisez des tuples ou utilisez des listes, mais pas les deux. –
Si cela était supporté, je serais d'accord que ce serait le meilleur comportement, mais je pense que si quelqu'un fait '2 +' abc ', il veut clairement' '2abc' 'alors pourquoi ne pas le permettre, etc. - C'est trop d'interprétation. Explicite est mieux qu'implicite. – agf
Vous pouvez simplement utiliser 'itertools.chain' pour enchaîner vos affaires et n'utilisez jamais' + 'à la place. – hochl