2016-05-11 10 views
1

Was sind einige gute Möglichkeiten, ein Tupel zu definieren, das aus Ganzzahlen besteht, bei denen die Anzahl der Vorkommen jedes Elements bekannt ist?Wie definiert man doppelte Einträge in einem Python-Tupel?

Zum Beispiel

Ich möchte ein Tupel mit 3 2 ist definieren, 2 und 4 der 1, 3, 5 einmal vorkommen.

Dazu kann ich immer den manuellen Weg gehen:

foo = (1, 2, 2, 2, 3, 4, 4, 5) 

jedoch wird dies ein bisschen chaotisch, wenn die Anzahl der Elemente in der Liste groß ist. Also, ich möchte wissen, was sind einige Möglichkeiten, um die Aufgabe zu automatisieren, die gewünschte Anzahl von Duplikaten jedes Elements zu generieren.

+0

Wie wird sich die Anzahl der Wiederholungen bestimmt werden? – vaultah

+0

@vaultah Sie sind im Voraus bekannt. Ich habe dies in der Frage selbst dargelegt. –

+0

Sie haben auch angedeutet, dass sich die Anzahl der Elemente ändern kann. – vaultah

Antwort

0

So etwas wie dies funktionieren könnte:

>>> result = tuple() 
>>> for item, repeat in ((1, 1), (2, 3), (3, 1), (4, 2), (5, 1)): 
... result = result + (item,) * repeat 
>>> result 
(1, 2, 2, 2, 3, 4, 4, 5) 
3

Sie es wie folgt tun:

>>> (1,) * 1 + (2,) * 3 + (4,) * 2 + (5,) * 1 
(1, 2, 2, 2, 4, 4, 5) 
+0

Dank @Dan D Dies funktioniert gut für mich +1 –

2

Eine Möglichkeit ist, Sequenz Multiplikation zu verwenden. Hier ist eine einfache Version, die keinen Versuch macht zu schaffen unnötigen Zwischen Objekten zu vermeiden:

accumulator =() 
for (val, count) in some_data_structure: 
    accumulator += (val,) * count 

die verbessert werden kann, die Hauptsache ist, zu zeigen, dass (1,) * 5 gibt Ihnen (1, 1, 1, 1, 1). Beachten Sie, dass dadurch die Objektreferenz kopiert wird. Dies ist für Ganzzahlen zulässig, kann jedoch zu Verwirrung führen, wenn Sie versuchen, eine Sequenz veränderbarer Objekte zu multiplizieren.

2

Wenn Sie ein Tupel von Tupeln angibt, den Wert und die Frequenz haben, können Sie wie folgt vorgehen:

tuples = ((1,1), (2,3), (3,1), (4,2), (5,1)) 

tuple(i for i, n in tuples for _ in range(n)) # Use xrange in Python 2.X 
# (1, 2, 2, 2, 3, 4, 4, 5) 

Oder, wenn Sie wissen, dass die Werte immer 1 zu gehen, 2, 3,. .., n, können Sie enumerate mit einem Tupel der Frequenzen verwenden.

freqs = (1, 3, 1, 2, 1) 

tuple(i for i, n in enumerate(freqs, 1) for _ in range(n)) 
# (1, 2, 2, 2, 3, 4, 4, 5) 

Wenn Sie über die Verwendung des Doppel Verständnis im Generator Ausdruck neugierig sind, können Sie this question überprüfen.

+0

Instant downvote? Verstand einen Grund geben? –

+0

Ich war nicht der Downvoter, aber vielleicht würde eine kleine Erklärung dessen, was vor sich geht, helfen? Dies ist im Grunde genommen die gleiche Idee wie in meiner Antwort und macht eine der Verbesserungen, auf die ich angespielt habe, um zu vermeiden, dass einige der unnötigen Zwischentupel erzeugt werden. –

+0

Dies ist ein Overkill für solch eine einfache Aufgabe. Die Komplexität von 'sum (..., [])' ist quadratisch. – vaultah

0

Sie möchten also die Umkehrfunktion von collections.Counter. Hier ist, wie Sie es tun könnte,

# make a dict of counts (list of tuples is better) 
counts = {1: 1, 2: 3, 4: 2, 3:1, 5: 1} 
t = tuple(k for k,v in sorted(counts.items()) for _ in range(v)) 
(1, 2, 2, 2, 3, 4, 4, 5) 
# for k,v in list_of_tuples, for a list of tuples 
0

können Sie definieren die folgende Funktion

def a_tuple(*data): 
    l = [] 
    for i, cnt in data: l.extend([i]*cnt) 
    return tuple(l) 

und es verwenden, wie diese

print(a_tuple((1,1), (2,3), (3,1), (4,2), (5,1))) 

die folgende Ausgabe

(1, 2, 2, 2, 3, 4, 4, 5) 
zu produzieren

Werfen Sie einen Blick auf die .extend() method of list wenn Sie nicht verstehen, wie die Funktion funktioniert.

1

Wenn Ihr Tupel nicht viele Nummern hat, können Sie es auf die einfachste Weise tun.

(1,)+(2,)*3+(3,)+(4,)*2+(5,) 

Andernfalls, nur um es in eine Funktion zu verwandeln.

def myTuple(*val): 
    return sum(((i,) * n for i, n in val),()) 

myTuple((1,1),(2,3),(3,1),(4,2),(5,1)) 
>>>(1, 2, 2, 2, 3, 4, 4, 5) 

Sie können es auch nennen mit:

val = ((1,1),(2,3),(3,1),(4,2),(5,1)) 
myTuple(*val) 
>>>(1, 2, 2, 2, 3, 4, 4, 5)