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

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

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
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.
Zuletzt geändert von BlackJack am Donnerstag 15. Februar 2007, 13:02, insgesamt 1-mal geändert.
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

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))]
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Wobei aber BlackJacks Code wesentlich eleganter ist.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

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.
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

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!!
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]
Benutzeravatar
Luzandro
User
Beiträge: 87
Registriert: Freitag 21. April 2006, 17:03

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
[url=http://www.leckse.net/artikel/meta/profilieren]Profilieren im Netz leicht gemacht[/url]
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

wow...

python ist echt klasse und ihr auch :)

danke!
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))``.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Auch binascii.hexlify() wäre eine Möglichkeit.
MfG
HWK
Antworten