2009-11-23 15 views
27

Ich habe den folgenden Code:Multipliziert man ein Tupel mit einem Skalar

print img.size 
print 10 * img.size 

dies

(70, 70) 
(70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70) 

drucken, während ich es drucken möchten

(700, 700) 

Ist eine Möglichkeit, Um dies zu tun ohne zu schreiben

print (10 * img.size[0], 10 * img.size[1]) 

PS: img.size ist ein PIL-Bild. Weiß nicht, ob das in diesem Fall etwas ausmacht.

+3

Was mit 'falsch ist (10 * img.size [0], 10 * img. Größe [1]) '? Ich verstehe nicht, warum Sie etwas so einfach überdimensionieren müssen wie eine Multiplikation von 2 ganzen Zahlen. Beachten Sie, dass dieses Tupel immer nur zwei Elemente enthält! – paprika

+7

Ich bin nicht overengineering. Ich frage, ob es einen schöneren, einfacheren Weg gibt. Lies meinen Beitrag noch einmal. –

+3

@paprika: ... weil das betreffende Tupel keine bekannte Länge haben kann. In diesem Fall (wie in dem Fall, der mich zu dieser Frage geführt hat), ist das Codieren für eine angenommene Tupellänge, das Wiederholen der Skalar * n * -Zeiten und das Erhalten von * n * Indizes richtig kludig genug, um zu vermeiden wenn es gerade möglich ist. – J0e3gan

Antwort

32

Könnte eine schönere Art und Weise sein, aber dies sollte

tuple([10*x for x in img.size]) 
+12

Etwas schöner: 'tuple (10 * x für x in img.size)' – Vegard

+0

https://Stackoverflow.com/a/48351745/500902 ist netter. Pats sich auf dem Rücken. – Marvin

1

Sie können so etwas versuchen arbeiten:

print [10 * s for s in img.size] 

Es wird Ihnen eine neue Liste mit allen Elementen, die Sie in der haben multipliziert mit 10 Tupel wäre

13

Der pythonic Weg, um eine Liste Verständnis mit:

y = tuple([z * 10 for z in img.size]) 

könnte eine andere Art und Weise sein:

y = tuple(map((10).__mul__, img.size)) 
+0

Das zweite ist genial ... haha. –

+2

Kein Beispiel erfasst den Punkt der Frage. Beides zwingt den Programmierer, eine einfache Idee (skalare Zeitmatrixmultiplikation) zu nehmen und sie zu dekonstruieren. –

24
img.size = tuple(i * 10 for i in img.size) 
3

Es gibt wohl einen einfacheren Weg, als diese, aber

print map(lambda x: 10*x, img.size) 

Wird fast das tun, was Sie wollen, obwohl es als ein druckt Liste statt ein Tupel. Wickeln Sie den map Aufruf in tuple(map...), wenn Sie möchten, dass es als ein Tupel (Klammern statt eckige Klammern) gedruckt wird.

2

Wenn Sie dieses Problem häufiger und mit größeren Tupeln oder Listen haben, dann möchten Sie möglicherweise die numpy Bibliothek verwenden, die Sie alle Arten von mathematischen Operationen auf Arrays durchführen können. In dieser einfachen Situation wäre dies jedoch ein vollständiger Overkill.

+0

Während für das * einfache * Beispiel Overkill wäre, um numpy zu verwenden, scheint der Punkt der Frage zu sein: "Bietet Python eine Möglichkeit, mimische Operationen einfach in Mathematik auszudrücken?" Ich meine, wenn Sie eine Matrix haben A = [70 70] dann 2A = [140 140]. –

0

Zugabe nichts anderes als Vielfalt ..

import operator 
img_size = (70, 70) 
map(operator.mul, img_size, len(img_size)*(10,)) 
6

Lösung:

set1=(70, 70) 
tuple(2*array(set1)) 

Erläuterung: arrays direkte Skalarmultiplikation möglich zu machen. Daher wird die tuple genannte set1 hier in eine array umgewandelt. Ich nehme an, Sie möchten weiterhin die tuple verwenden, daher konvertieren wir die array zurück in eine tuple.

Diese Lösung soll die explizite und ausführliche for Schleife vermeiden. Ich weiß nicht, ob es schneller ist oder ob das gleiche in beiden Fällen passiert.

+1

Das funktioniert in Python 2 oder 3 nicht, soweit ich das beurteilen kann. Ich nehme an, dass 'array' vom' array' Modul kommt? Python erwartet ein Zeichen als erstes Argument für 'array'. Wenn also nur ein Tupel übergeben wird, wird mit' TypeError: array() argument 1 oder typecode muss char (string oder ascii-unicode mit Länge 1), nicht tuple' gescheitert sein. Kannst du das mit einem umfassenderen Beispiel weiter ausführen? – Kumba

1

Im Einklang mit den bisherigen Antworten aber mit numpy:

import numpy as np 
result = tuple(10*np.array(img.size)) 
0

Sie versuchen die Funktion auf Tuple als Ganzes anzuwenden. Sie müssen es auf einzelne Elemente anwenden und ein neues Tupel zurückgeben.

newTuple = tuple([10*x for x in oldTuple]) 

Denken Sie daran, Sie können ein Tupel nicht ändern.

0

Simplish Sache, wenn Sie eine Reihe von Code schreiben, aber nicht eine kompliziertere Vektor-Bibliothek wollen ...

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) 

Die „V“ Instanzen ansonsten wie Tupel verhalten. Dies erfordert, dass die "V" -Instanzen alle mit der gleichen Anzahl von Elementen erstellt werden. Sie könnten zum Beispiel hinzufügen, um __new__

if len(args)!=2: raise TypeError('Must be 2 elements') 

zu erzwingen, dass alle Instanzen 2d Vektoren ....

Verwandte Themen