W odpowiedzi przez Konrad Rudolph
zip prawie robi to, co chcesz; niestety, zamiast jeździć krótszą listą, pęka. Być może istnieje powiązana funkcja, która cyklicznie?
Oto sposób:
keys = ['name', 'age']
values = ['Monty', 42, 'Matt', 28, 'Frank', 33]
iter_values = iter(values)
[dict(zip(keys, iter_values)) for _ in range(len(values) // len(keys))]
nie będę nazwać pythonowy (myślę, że to zbyt mądry), ale może to być co szukasz.
Nie ma żadnych korzyści w kolarstwie listę keys
korzystając itertools
.cycle()
, ponieważ każdy przechodzenie od keys
odpowiada stworzeniu jednej dictionnary.
EDIT: Oto kolejny sposób:
def iter_cut(seq, size):
for i in range(len(seq)/size):
yield seq[i*size:(i+1)*size]
keys = ['name', 'age']
values = ['Monty', 42, 'Matt', 28, 'Frank', 33]
[dict(zip(keys, some_values)) for some_values in iter_cut(values, len(keys))]
Jest to o wiele bardziej pythonic: istnieje czytelna funkcja użyteczności z jasnego celu, a reszta kodu przepływa naturalnie z niej.
Używanie l (małe litery ell) jako nazwy zmiennej to śmiertelne naruszenie pep8. Twoja licencja Pythoning zostaje niniejszym odwołana! ;) – ddaa
Dziękuję Toni! wyjdziesz za mnie !? Zaznaczam twoją odpowiedź jako zaakceptowaną, ponieważ jest ona (teraz) najprostszym i łatwym do odczytania IMHO. –
Użyj suwaka i części krokowej operatora plasterka, aby umieścić to wszystko w jednym zrozumieniu listy: [dykt (zip (klucze, a)) dla zipa (wartości [:: 2], wartości [1 :: 2])] – jblocksom