J'ai le code suivant:
print(img.size)
print(10 * img.size)
Cela imprimera:
(70, 70)
(70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70)
Je voudrais qu'il imprime:
(700, 700)
Existe-t-il un moyen de le faire sans avoir à écrire:
print(10 * img.size[0], 10 * img.size[1])
PS: img.size
est une image PIL. Je ne sais pas si cela importe dans ce cas.
Cela pourrait être une meilleure façon, mais cela devrait fonctionner
Tuple([10*x for x in img.size])
img.size = Tuple(i * 10 for i in img.size)
La manière Pythonic serait d'utiliser une compréhension de liste:
y = Tuple([z * 10 for z in img.size])
Une autre façon pourrait être:
y = Tuple(map((10).__mul__, img.size))
Solution:
set1=(70, 70)
Tuple(2*array(set1))
Explication: arrays
permet la multiplication scalaire directe. D'où le Tuple
appelé set1
ici est converti en array
. Je suppose que vous souhaitez continuer à utiliser le Tuple
, nous convertissons donc le array
en Tuple
.
Cette solution consiste à éviter la boucle explicite et verbeuse for
. Je ne sais pas si c'est plus rapide ou si exactement la même chose se produit dans les deux cas.
Chose simple si vous écrivez un tas de code, mais que vous ne voulez pas d'une bibliothèque vectorielle plus compliquée ...
class V(Tuple):
'''A simple vector supporting scalar multiply and vector add'''
def __new__ (cls, *args):
return super(V, cls).__new__(cls, args)
def __mul__(self,s):
return V( *( c*s for c in self) )
def __add__(self,s):
return V( *( c[0]+c[1] for c in Zip(self,s)) )
def __repr__(self):
return "V" + super(V, self).__repr__()
# As long as the "vector" is on the left it just works
xaxis = V(1.0, 0.0)
yaxis = V(0.0, 1.0)
print xaxis + yaxis # => V(1.0, 1.0)
print xaxis*3 + yaxis*5 # => V(3.0, 5.0)
print 3*xaxis # Broke, => (1.0, 0.0, 1.0, 0.0, 1.0, 0.0)
Les instances "V" se comportent autrement comme des tuples. Cela nécessite que les instances "V" soient toutes créées avec le même nombre d'éléments. Vous pouvez ajouter, par exemple, à __new__
if len(args)!=2: raise TypeError('Must be 2 elements')
pour faire en sorte que toutes les instances soient des vecteurs 2D ....
Si vous rencontrez ce problème plus souvent et avec des tuples ou des listes plus grandes, vous souhaiterez peut-être utiliser la bibliothèque numpy , qui vous permet d'effectuer toutes sortes d'opérations mathématiques sur des tableaux. Cependant, dans cette situation simple, ce serait une surpuissance totale.
Il existe probablement un moyen plus simple que cela, mais
print map(lambda x: 10*x, img.size)
Fera presque ce que vous voulez, bien qu'il s'imprime comme une liste plutôt que comme un tuple. Enveloppez l'appel map
à l'intérieur de Tuple(map...)
si vous voulez qu'il s'imprime en tant que Tuple (entre parenthèses plutôt qu'en crochets).
En ligne avec les réponses précédentes mais en utilisant numpy:
import numpy as np
result = Tuple(10*np.array(img.size))
Vous pouvez essayer quelque chose comme ceci:
print [10 * s for s in img.size]
Il vous donnera une nouvelle liste avec tous les éléments que vous avez dans le Tuple multiplié par 10
Vous essayez d'appliquer la fonction sur Tuple dans son ensemble. Vous devez l'appliquer sur des éléments individuels et renvoyer un nouveau tuple.
newTuple = Tuple([10*x for x in oldTuple])
N'oubliez pas que vous ne pouvez pas modifier un tuple.
n'ajouter que de la variété ..
import operator
img_size = (70, 70)
map(operator.mul, img_size, len(img_size)*(10,))