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

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

Beitragvon Dill » Donnerstag 15. Februar 2007, 11:18

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

Beitragvon BlackJack » Donnerstag 15. Februar 2007, 11:25

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:

Beitragvon nkoehring » Donnerstag 15. Februar 2007, 11:54

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))]
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Beitragvon birkenfeld » Donnerstag 15. Februar 2007, 12:17

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

Beitragvon Dill » Donnerstag 15. Februar 2007, 13:06

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

Beitragvon Dill » Donnerstag 15. Februar 2007, 13:13

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

Beitragvon BlackJack » Donnerstag 15. Februar 2007, 13:15

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

Beitragvon Luzandro » Donnerstag 15. Februar 2007, 13:23

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

Beitragvon Dill » Donnerstag 15. Februar 2007, 13:25

wow...

python ist echt klasse und ihr auch :)

danke!
BlackJack

Beitragvon BlackJack » Donnerstag 15. Februar 2007, 13:33

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

Beitragvon HWK » Donnerstag 15. Februar 2007, 14:08

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

Wer ist online?

Mitglieder in diesem Forum: Google [Bot]