объединить список из 2 списков или использовать набор запросов? - PullRequest
0 голосов
/ 31 марта 2011

Мои модели следующие (поля в полу и на доске несущественны и опущены)

class floor(models.Model):

class board(models.Model):

class run(models.Model):
    floor = models.ForeignKey(Floor)
    boards = models.ManyToManyField(Board)

У меня следующий запрос:

runs = Run.objects.filter(floor=1)

, который возвращает 2 объекта запуска. Каждый прогон имеет выбор досок.

runs[0].boards

возвращает список связанных досок. Если я сделаю понимание следующим образом:

[run.boards.all() for run in runs]

Я получаю список таких списков:

[[1,2,3,4,5], [6,7,8,9,10]]

Каков эффективный и действенный способ вписать приведенный выше список в приведенный ниже список?

[1,2,3,4,5,6,7,8,9,10]

Я надеюсь на решение в 1 строку. Возможно ли это с помощью методов набора запросов django или лучше всего это сделать с помощью python?

Ответы [ 3 ]

3 голосов
/ 31 марта 2011

Simple:

board.objects.filter(run__floor=1)
2 голосов
/ 31 марта 2011

Самый простой метод, который я мог придумать:

>>> all_boards=[]
>>> for boards in (run.boards.all() for run in runs):
        all_boards+=run
>>> all_boards
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> 

Я изменил понимание списка [...] на генератор понимания (...).Возможно, здесь это не имеет значения, но для некоторых приложений вы можете сэкономить много памяти, используя генераторы, вместо того, чтобы каждый раз создавать полный список.


В стороне

Вы можетепродолжайте лень:

>>> l = [[1,2,3,4,5], [6,7,8,9,10]]
>>> def G(lol):
        for inner_list in lol:
            for element in inner_list:
                yield element
>>> for i in G(l):
        print(i,end=',')
1,2,3,4,5,6,7,8,9,10,
>>> 

Элементы выходят из G (), сплющенные, по одному элементу за раз, так что вы можете проходить по ним и выполнять свою работу для каждого элемента без необходимости создаватьвременный список.

1 голос
/ 31 марта 2011

, хотя на вопрос был получен лучший ответ, я не могу удержаться от адвокации itertools

from itertools import chain

all_boards = list(chain(*runs))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...