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

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:

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: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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:

@ 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:

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: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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

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)
:-)
Antworten