zwei gepackte Listen in ein Dict schreiben

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.
htw7448
User
Beiträge: 51
Registriert: Montag 16. April 2007, 10:59
Wohnort: Messel(Hessen)
Kontaktdaten:

zwei gepackte Listen in ein Dict schreiben

Beitragvon htw7448 » Donnerstag 18. Oktober 2007, 14:35

Hallo liebe pythoner,

ich mich plagt folgendes Problem:

Ich habe 2 Listen. Dabei ist mir die richtige Integration von range() schleierhaft.



Code: Alles auswählen

adapter = [(1-50), (51-85), (86-100)]
liste2 = [test1, test2, test3]


Diese 2 Listen sollen möglichst zeitsparend in folgendes ´´Dict´´ gebracht werden:

dict = {'test1':[adapter_001_1, adapter_002_1, ..., adapter_050_1], 'test2':[adapter_051_1, adapter_052_1, ..., adapter_085_1], 'test3':[adapter_086_1, adapter_087_1, ..., adapter_100_1]}

was mir in diesem Zusammenhang auffällt ist noch folgendes:

Code: Alles auswählen

a= [(1,50), (51,60)]
b = ['test1', 'test2']

result = {}
for i in range(len(b)):
   print i
   range a[i]
   #result[b[i]] = [range(a[i])]


wieso arbeitet range dort nicht korrekt. Python braucht Integer bekommt aber tupel als Datentyp. Arbeitet die range Fkt. nich mit tupeln alá range(1, 50)?
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Re: zwei gepackte Listen in ein Dict schreiben

Beitragvon Rebecca » Donnerstag 18. Oktober 2007, 14:47

htw7448 hat geschrieben:Python braucht Integer bekommt aber tupel als Datentyp. Arbeitet die range Fkt. nich mit tupeln alá range(1, 50)?

Nein, range erwartet 1 bis 3 Integers als Parameter. Was du suchst, ist das hier:

Code: Alles auswählen

>>> a = (1, 10)
>>> range(*a)
[1, 2, 3, 4, 5, 6, 7, 8, 9]

Damit machst du aus dem Tupel a eine Parameterliste (Liste jetzt nicht wie der Datentyp...).
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Donnerstag 18. Oktober 2007, 14:48

Hallo htw!

So in etwa?

Code: Alles auswählen

>>> a = ((1, 50), (51, 85), (86, 100))
>>> b = ("test1", "test2", "test3")
>>> zip(b, a)
[('test1', (1, 50)), ('test2', (51, 85)), ('test3', (86, 100))]
>>> result = {}
>>> for (key, valuerange) in zip(b, a):
...     result[key] = [ "adapter_%03i_1" % value for value in xrange(valuerange[0], valuerange[1] + 1) ]
...     
>>> result
{'test1': ['adapter_001_1', 'adapter_002_1', ...
>>>


EDIT:

Vielleicht besser so:

Code: Alles auswählen

>>> for (key, (start, stop)) in zip(b, a):
...     result[key] = [ "adapter_%03i_1" % value for value in xrange(start, stop + 1) ]
...

Dann wird es ein wenig kürzer.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
htw7448
User
Beiträge: 51
Registriert: Montag 16. April 2007, 10:59
Wohnort: Messel(Hessen)
Kontaktdaten:

Beitragvon htw7448 » Donnerstag 18. Oktober 2007, 14:53

@ Rebecca genau das habe ich gesucht.

@ gerold so schnell mit einer Komplettlösung

:shock:

die zip idee ist klasse. Wiedermal einiges gelernt danke!
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

Beitragvon schlangenbeschwörer » Donnerstag 18. Oktober 2007, 14:53

range erwartet kein tupel, sondert argumente. diese werden zwischen 2 runde klammern geschrieben. das ist aber dann kein tupel. die argumente sind dann zahlen.
wenn du das so machen willst, kannst du das tupel mit nem vorgestellten * entpacken:

Code: Alles auswählen

print range(*(2, 7))


deine schleife kannst du dann schon nehmen, wobei du nicht range nehmen solltest. entweder xrange, besser aber noch zip

Code: Alles auswählen

a= [(1,50), (51,60)]
b = ['test1', 'test2']

result = {}
for a_item, b_item in zip(a,b):
    result[b_item] = b_item


edit: man, bin ich langsam :roll:
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Donnerstag 18. Oktober 2007, 15:05

schlangenbeschwörer hat geschrieben:man, bin ich langsam :roll:

Hallo schlangenbeschwörer!

Mach' dir nichts draus! Du hast den Thread einfach zu spät entdeckt. :D

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs

Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
BlackJack

Beitragvon BlackJack » Donnerstag 18. Oktober 2007, 15:12

Und noch eine Variante mit dem IMHO viel zu wenig beachteten `itertools.starmap():

Code: Alles auswählen

from itertools import izip, starmap
from pprint import pprint


def make_adapter_names(start, end):
    return ['adapter_%03d_1' % i for i in xrange(start, end + 1)]


def main():
    ranges = ((1, 50), (51, 85), (86, 100))
    keys = ('test1', 'test2', 'test3')
   
    result = dict(izip(keys, starmap(make_adapter_names, ranges)))
    pprint(result)


:-)

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot], Google [Bot]