2013-04-01 9 views
5

Próbuję zbudować listę płytek do gry planszowej z pliku xml, który zawiera opis kafelków. Plik xml opisuje każdy typ płytki i liczbę płytek tego typu.Utwórz pojedynczą listę z wieloma instancjami obiektów z drugiej listy w Pythonie

Dotychczas Mam następujący kod, który tworzy listę z dokładnie jednym z każdego rodzaju płytek:

[Tile(el.id) for el in <tile descriptions>] 

Chciałbym utworzyć listę z odpowiednią liczbą każdej płytki, na przykład coś takiego:

[Tile(el.id) * <el.n_tiles> for el in <tile descriptions>] 

Czy istnieje elegancki jeden-liner to zrobić, czy muszę to zrobić długiej ręki, tworząc listę dla każdego rodzaju płytek, a następnie łącząc?

+0

Innymi słowy, chcesz, aby elementy zwróconej listy były same w sobie, każda z długości 'el.n_tiles'? Jeśli tak, rozważ odpowiedź NPE. – jedwards

Odpowiedz

3

Jak o:

[Tile(el.id) for el in <tile descriptions> for _ in range(el.n_tiles)] 
+0

To załatwiło sprawę. Dzięki! – Stefan

3

kod pisał powtórzy same wewnętrzna lista wielokrotnie:

[Tile(el.id) * <el.n_tiles> for el in <tile descriptions>] 

Zamiast używać wewnętrzną listowych:

[[Tile(el.id) for i in range(<el.n_tiles>)] for el in <tile descriptions>] 

Jeśli celem jest utworzenie pojedynczej połączonej listy, należy n użyć wyrażeń listowych z zagnieżdżonych pętli for-:

[Tile(el.id) for el in <tile descriptions> for i in range(<el.n_tiles>)] 

Kiedy jesteś trochę bardziej zaawansowany, ten sam efekt (lista spłaszczenie) można osiągnąć stosując itertools.chain.from_iterable.

Mam nadzieję, że to pomoże. Happy gaming :-)

+0

Dzięki. Nie mogłem wykonać tej pracy tak, jak jest ... jest "r zakresu" literówka? Bez "r" to działało, ale wciąż starałem się, aby to działało. Przeczytasz na wewnętrznych listach ze zrozumieniem :-). – Stefan

+0

Tak, to był błąd literowy. Naprawiono to teraz :-) –

+0

Dzięki. Taka sama literówka w drugim przykładzie teraz ... błąd kopiowania i wklejania? – Stefan

Powiązane problemy