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

Verfasst: Donnerstag 18. Oktober 2007, 15:05
von gerold
schlangenbeschwörer hat geschrieben:man, bin ich langsam

Hallo schlangenbeschwörer!
Mach' dir nichts draus! Du hast den Thread einfach zu spät entdeckt.
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)
