Ich möchte char "komprimieren" und in Python auflisten:

Ein Beispiel:

char = '<'
list = [3, 23, 67]

"zip"(char, list) 
 >>> [('<', 3), ('<', 23), ('<', 67)]

Wie ich itertools.repeat () verwende:

itertools.izip(itertools.repeat(char, len(list)), list)
>>>[('<', 3), ('<', 23), ('<', 67)]

Es funktioniert, aber es ist so interessant, mehr pythonische Lösungen zu finden.

2
Viach Kakovskyi 5 Dez. 2013 im 18:44

5 Antworten

Beste Antwort

Sie brauchen hier keine Werkzeuge.

Listenverständnis verwenden:

>>> char = '<'
>>> lst = [3, 23, 67]
>>> [(char, n) for n in lst]
[('<', 3), ('<', 23), ('<', 67)]

Übrigens, verwenden Sie list nicht als Variablennamen. Es schattiert die integrierte Funktion list.

4
falsetru 5 Dez. 2013 im 14:46

Wenn char immer nur für alle Paarungen wiederverwendet wird, verwenden Sie einfach ein Listenverständnis:

>>> [(char, i) for i in lst]
[('<', 3), ('<', 23), ('<', 67)]

Wenn char eine Zeichenfolge von Zeichen ist und Sie diese beim Pairing durchlaufen möchten (wie bei zip() für die Sequenz mit der kürzesten Länge), verwenden Sie itertools.cycle():

>>> from itertools import cycle
>>> chars = 'fizz'
>>> lst = range(6)
>>> zip(chars, lst)
[('f', 0), ('i', 1), ('z', 2), ('z', 3)]
>>> zip(cycle(chars), lst)
[('f', 0), ('i', 1), ('z', 2), ('z', 3), ('f', 4), ('i', 5)]

Beachten Sie, wie die Zeichen der Zeichenfolge 'fizz' wiederverwendet werden, um sie mit den Zahlen 4 und 5 zu koppeln. Sie werden weiterhin so durchlaufen, dass sie mit jeder Längenliste übereinstimmen (die endlich sein muss).

1
Martijn Pieters 5 Dez. 2013 im 14:55

Wenn Sie zip wirklich verwenden möchten, gehen Sie wie folgt vor:

l  = [3, 23, 67]
zip('<' * len(l), l)

[('<', 3), ('<', 23), ('<', 67)]

In weiteren Details ist itertools.repeat(char, len(list)) im Ergebnis '<' * 3 ziemlich ähnlich. Außerdem arbeiten beide mit zip (Sie können auch zip(itertools.repeat(char, len(list)), l)) schreiben).

1
njzk2 5 Dez. 2013 im 15:03
[(char, i) for i in list]

Das Benennen Ihrer Liste als "Liste" ist übrigens wahrscheinlich keine gute Idee, da dies den Konstruktor für den internen Listentyp beschattet.

4
Daniel 5 Dez. 2013 im 14:46

Wenn Sie etwas möchten, das Ihrer Verwendung von itertools entspricht - die verzögerte Generierung für die Iteration -, können Sie Generatorausdrücke verwenden. Die Syntax entspricht weitgehend dem Listenverständnis, außer dass Sie den Ausdruck in Klammern einschließen.

>>> c = '<'
>>> l = [3, 23, 67]
>>> my_gen = ((c, item) for item in l)
>>> for item in my_gen:
...     print item
...
('<', 3)
('<', 23)
('<', 67)

Weitere Informationen finden Sie in der PEP, die dies erklärt: http://www.python.org / dev / peps / pep-0289 /

1
Jeremy Brown 5 Dez. 2013 im 14:52