Seite 1 von 1

zwei gepackte Listen in ein Dict schreiben

Verfasst: Donnerstag 18. Oktober 2007, 14:35
von htw7448
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)?

Re: zwei gepackte Listen in ein Dict schreiben

Verfasst: Donnerstag 18. Oktober 2007, 14:47
von Rebecca
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...).

Verfasst: Donnerstag 18. Oktober 2007, 14:48
von gerold
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
:-)

Verfasst: Donnerstag 18. Oktober 2007, 14:53
von htw7448
@ Rebecca genau das habe ich gesucht.

@ gerold so schnell mit einer Komplettlösung

:shock:

die zip idee ist klasse. Wiedermal einiges gelernt danke!

Verfasst: Donnerstag 18. Oktober 2007, 14:53
von schlangenbeschwörer
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:

Verfasst: Donnerstag 18. Oktober 2007, 15:05
von gerold
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
:-)

Verfasst: Donnerstag 18. Oktober 2007, 15:12
von 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)
:-)