web-dev-qa-db-fra.com

Tuple de concaténation

Supposons que j'ai une liste:

a=[1,2,3,4,5]  

Maintenant, je veux convertir cette liste en tuple. Je pensais que coder quelque chose comme ça ferait:

state=()  
for i in a:  
    state=state+i

et cela a donné une erreur. C'est assez évident pourquoi, je suis essayant de concaténer un entier avec un Tuple.

Mais les tuples n'ont pas les mêmes fonctions que les listes, comme insérer ou ajouter. Alors, comment puis-je ajouter des éléments en boucle? Même chose avec les dictionnaires, j'ai l'impression d'avoir un lien manquant.

24
user784530

Les tuples sont immuables, vous ne pouvez pas les ajouter, les supprimer ou les modifier du tout. Si vous souhaitez transformer une liste en Tuple, vous pouvez simplement utiliser la fonction Tuple:

Tuple(a)

Si, pour une raison quelconque, vous ressentez le besoin d'ajouter à un tuple (vous ne devriez jamais faire cela), vous pouvez toujours le reconvertir en liste, ajouter, puis le reconvertir en tuple:

Tuple(list(a)+b)

Continuez à obtenir des votes pour cela, ce qui signifie que les gens continuent de le voir, alors il est temps de mettre à jour et de supprimer les informations erronées.

Il est normal d'ajouter des éléments à un tuple (en quelque sorte). C'était une chose idiote à dire. Les tuples sont toujours immuables, vous ne pouvez pas les modifier, mais vous pouvez en créer de nouveaux qui ressemblent à ceux que vous avez ajoutés en assemblant plusieurs tuples. Tuple(list(a)+b) est stupide, ne faites pas ça. Faites simplement Tuple1 + Tuple2, Car Python ne craint pas. Pour le code fourni, vous voudriez:

state = ()  
for i in a:  
    state += (i,)

La réponse de Paul à cette réponse est bien plus juste que cette réponse ne l'a jamais été.

Maintenant, je peux arrêter de me sentir mal à ce sujet.

56
Josiah
state=()  
for i in a:  
    state=state+(i,)

Le code ci-dessus fonctionnera pour concaténer chaque fois qu'une nouvelle Tuple (i,) dans l'état Tuple.

J'utilise python 2.7.9.

11
byron
>>> a = [1,2,3,4,5]
>>> Tuple(a)
(1, 2, 3, 4, 5)

juste une sorte de précision: (2,) est en fait identique à Tuple([2]) donc vous pouvez écrire:

>>>(2,) + Tuple([2,3])
(2, 2, 3)
>>> Tuple([2]) + (2,3)
(2, 2, 3)
>>> Tuple([2]) + Tuple([2,3])
(2, 2, 3)

le python est en effet très souple

2
wiesiu_p

Si vous voulez une solution généralisée, créez simplement une nouvelle liste, puis convertissez-la en un tuple une fois terminée.

Vous pouvez augmenter progressivement votre Tuple en utilisant la solution fournie dans les réponses de Josia et Byron, mais cela créera un nouveau Tuple pour chaque itération, ce qui est très inefficace si la liste que vous souhaitez convertir est grande, car l'interprète devra copier tous les éléments de l'ancien Tuple au nouveau Tuple, à chaque itération, ce qui nécessite des opérations O (n ^ 2).

Cela ne se produit pas avec les listes, car python allouera en fait plus mémoire que nécessaire pour simplement stocker les éléments de la liste, juste au cas où vous y ajouteriez. Eh bien, au moins, il n'est pas nécessaire jusqu'à ce que la mémoire soit épuisée et python doit allouer plus de mémoire. Ensuite, il allouera une grande partie de la mémoire et se déplacera sur tous les éléments vers le nouvel emplacement, mais encore une fois ce nouveau morceau de mémoire sera plus grand que nécessaire pour simplement stocker les éléments de la liste. Construire une liste de cette façon nécessite juste O(n) opérations et est donc préférable.

1
HelloGoodbye

Tuple n'est pas modifiable en python.

donc après l'avoir initialisé avec Tuple (...), il ne peut pas être modifié.

a = [1,2,3,4,5]
Tuple(a) 
1
holsety

Après avoir rencontré des problèmes similaires lors de la construction d'un C/NN avec des formes de tenseur flexibles, je pense avoir créé la solution la plus générale à ce problème:

def cat(*args):
  x = ()
  for a in args:
    if type(a) is Tuple:
      x+=a
    Elif type(a) in {list,numpy.ndarray}:
      x+=Tuple(a)
    else:
      x+=(a,)
  return Tuple(x)

Démo:

In [0]: cat(1,(1,2),(3,4),[1,2],2)
Out[0]: (1, 1, 2, 3, 4, 1, 2)

Je ne sais pas si c'est du mauvais python, je suis nouveau :)

0
Jesse Knight