2017-10-13 9 views
3

j'ai tuples sous forme de:objets dans tuples - Permutation python

a[i][j][k] 

k ∈ [0,1] un est composé d'objets T, qui sont inclus dans une liste des équipes. Ce que je veux, c'est permuter la position de toutes les paires a [i] [j] [0] et a [i] [j] [1]. si:

a[i][j][0], a[i][j][1] = a[i][j][1], a[i][j][0] 

En est un tuple, je comprends qu'il est immuable, qui est la raison pour laquelle cela ne fonctionne pas:

for i in range(0, len(teams)-1): 
    for j in range(0, len(teams)/2): 
     a[i][j][0],a[i][j][1] = a[i][j][1],a[i][j][0] 

J'ai essayé de convertir une à une liste (L = liste (a)), mais sans succès.

Quelqu'un peut-il m'aider avec des suggestions? Désolé si mon n'est pas encore nomenclature parfaite, voici ma première question sur le SO :)

Merci

+2

Nous aurions besoin de voir un [mcve]. est un tuple de tuple de tuples? –

+0

D'où viennent les «équipes»? – arsho

+0

Est-ce que le calque le plus externe est un tuple ou une liste? – James

Répondre

4

disons a est un tuple de tuple s de tuple s.

je serais

  • convertir à une liste de listes de listes
  • faire ce que je veux
  • reconvertir au format d'origine si nécessaire

exemple:

a = (((1,2),(3,4)),((10,20),(30,40))) 

a_as_list = [[list(x) for x in b] for b in a] 

print(a_as_list) 

# now manipulate elements: 

a_as_list[0][0] = [a_as_list[0][0][1],a_as_list[0][0][0]] 

a_as_tuple = tuple(tuple(tuple(x) for x in b) for b in a_as_list) 


print(a_as_tuple) 

résultat:

[[[1, 2], [3, 4]], [[10, 20], [30, 40]]] 
(((2, 1), (3, 4)), ((10, 20), (30, 40))) 

comme vous le voyez, les tuples ont été convertis à la liste, travaillé, puis reconvertis en tuples

EDIT: si a est une liste de liste de tuples vous ne pouvez pas faire:

a[i][j][0], a[i][j][1] = a[i][j][1], a[i][j][0] 

mais vous pouvez recréer le tuple:

a[i][j] = a[i][j][1],a[i][j][0] 
+0

Merci. C'était une solution rapide avec la citation existante que j'ai. –

+0

@ MaximilianA.Graves voir mon édition, cela devrait être suffisant –

+0

Parfait. Je suppose que je dois lire et apprendre beaucoup plus sur la différence entre les listes et les tuples. Mais c'était déjà très utile! –

1

Nous pouvons simplement faire en utilisant Pyt L'honorable de reversed

a[j][k] = tuple(reversed(a[j][k])) 
+0

Je vais essayer aussi. Cela semble vraiment beaucoup plus économique. –

1

Problème

tuples sont immutables en effet. a peut être une liste, ou même une liste de listes. Donc ce code:

L = list(a) 

ne changera rien. Le problème semble être que a est une liste de listes de tuples.a[i][j] est un tuple, et il est impossible d'attribuer de nouvelles valeurs à elle:

>>> t = ('a', 'b') 
>>> t[0] = 'b' 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: 'tuple' object does not support item assignment 

Solution possible

Si vous travaillez avec des matrices 3-D, numpy pourrait probablement vous aider. Il prend en charge advanced indexing and slicing:

>>> import numpy as np 
>>> table = np.arange(18).reshape(3,3,2) 
>>> table 
array([[[ 0, 1], 
     [ 2, 3], 
     [ 4, 5]], 

     [[ 6, 7], 
     [ 8, 9], 
     [10, 11]], 

     [[12, 13], 
     [14, 15], 
     [16, 17]]]) 
>>> table[:, :, [0, 1]] = table[:, :, [1, 0]] 
>>> table 
array([[[ 1, 0], 
     [ 3, 2], 
     [ 5, 4]], 

     [[ 7, 6], 
     [ 9, 8], 
     [11, 10]], 

     [[13, 12], 
     [15, 14], 
     [17, 16]]]) 

éléments à l'intérieur de la matrice ne doivent pas être des nombres, ils pourraient être des objets:

>>> class T(str): 
... pass 
... 
>>> T('test') 
'test' 
>>> m = np.array([[(T(1), T(2))],[(T(3), T(4))]]) 
>>> m[:, :, [0, 1]] = m[:, :, [1, 0]] 
>>> m 
array([[['2', '1']], 

     [['4', '3']]], 
     dtype='<U1') 
+0

Merci beaucoup. Je vais jouer avec numpy aussi! –