Seite 1 von 1

in for ... in ... auf index zugreifen

Verfasst: Donnerstag 15. Februar 2007, 11:18
von Dill
Hi,


ich habe eine liste mit elementen die ich umwandeln möchte in eine liste von 2-elementigen listen der form: [index,element].

Code: Alles auswählen

for element in elements:
   index = index + 1
   list.append([index, element])
geht natürlich, aber wie mache ich das in der anderen lustigen schreibweise (wie nennt man das?)

Code: Alles auswählen

[[INDEX(?), element] for element in elements]
wie kann ich hier auf den index zugreifen

Verfasst: Donnerstag 15. Februar 2007, 11:25
von BlackJack
Die lustige Schreibweise nennt sich "list comprehension", manchmal mit "list comp" abgekürzt.

Wenn es auch Tupel der Form (index, element) sein dürfen:

Code: Alles auswählen

result = list(enumerate(elements))
Ansonsten:

Code: Alles auswählen

result = map(list, enumerate(elements))
Edit: Fipptehler beseitigt.

Verfasst: Donnerstag 15. Februar 2007, 11:54
von nkoehring
Ich glaub du meinst das hier (um es in dieser schreibweise zu bringen):

Code: Alles auswählen

newList = [[i, elements[i]] for i in range(len(elements))]

Verfasst: Donnerstag 15. Februar 2007, 12:17
von birkenfeld
Wobei aber BlackJacks Code wesentlich eleganter ist.

Verfasst: Donnerstag 15. Februar 2007, 13:06
von Dill
Hi,

danke für eure hilfe!

da die elemente noch eine bedingung erfüllen müssen, mache ich das so:

Code: Alles auswählen

[[elem[0], elem[1]] for elem in enumerate(elements) if elem[1] > 0]
sehr hübsch.

Verfasst: Donnerstag 15. Februar 2007, 13:13
von Dill
das geht wahrscheinlich noch einfacher, aber eigentlich muss ich sowas machen:

Code: Alles auswählen

"".join([struct.pack("BB", elem[0], elem[1][d_ptr], elem[1][a_ptr]) for elem in enumerate(elements) if elem[1][d_ptr] > 0])
das war jetzt keine frage :)

aber: gibt es eine möglichkeit mir diesen string als liste von hexwerten anzuschauen. die shell macht das automatisch, mit print kommt dann aber nur ein sonderzeichen.

>>> struct.pack("b",1)
'\x01'
>>> s=_
>>> s
'\x01'
>>> print s
☺ #<-- hier hätte ich gern die hex darstellung!!

Verfasst: Donnerstag 15. Februar 2007, 13:15
von BlackJack
Ich würde den beiden Elementen noch einen Namen geben, das ist IMHO hübscher.

Code: Alles auswählen

[[index, item] for index, item in enumerate(elements) if item > 0]

Verfasst: Donnerstag 15. Februar 2007, 13:23
von Luzandro
Dill hat geschrieben: >>> s
'\x01'
>>> print s
☺ #<-- hier hätte ich gern die hex darstellung!!

Code: Alles auswählen

>>> print '\x01'.encode("string-escape")
\x01

Verfasst: Donnerstag 15. Februar 2007, 13:25
von Dill
wow...

python ist echt klasse und ihr auch :)

danke!

Verfasst: Donnerstag 15. Februar 2007, 13:33
von BlackJack
Bei dem `struct.pack()` fehlt ein Formatzeichen. Da sind nur zwei 'B', aber drei Argumente. Angenommen das sollten drei 'B' sein, dann würde ich das so schreiben (ungetestet):

Code: Alles auswählen

from itertools import imap

def foo(iterable):
    for index, item in enumerate(iterable):
        if item[d_ptr] > 0:
            for result in (index, item[d_ptr], item[a_ptr]):
                yield result

result = ''.join(imap(chr, foo(elements)))
Die Namen könnten spezifischer sein, aber ich weiss ja nicht worum es geht.

Wenn bei der Ausgabe nicht alles in Hex geschrieben werden soll, sondern nur die Bytes, die nicht als druckbare ASCII-Zeichen dargestellt werden können, dann geht auch ``print repr(s))``.

Verfasst: Donnerstag 15. Februar 2007, 14:08
von HWK
Auch binascii.hexlify() wäre eine Möglichkeit.
MfG
HWK