Помощь с пониманием списка Python - PullRequest
3 голосов
/ 09 апреля 2010

Упрощенная версия моей проблемы:

У меня есть понимание списка, которое я использую для установки битовых флагов в двумерном списке так:

s = FLAG1 | FLAG2 | FLAG3
[[c.set_state(s) for c in row] for row in self.__map]

Все set_state делает:

self.state |= f

Это прекрасно работает, но мне нужно иметь эту функцию "set_state" в каждой ячейке в __map.Каждая ячейка в __map имеет .state, поэтому я пытаюсь сделать что-то вроде:

[[c.state |= s for c in row] for row in self.map]

или

map(lambda c: c.state |= s, [c for c in row for row in self.__map])

За исключением того, что ни одна из них не работает (синтаксическая ошибка).Возможно, я лаю не то дерево с картой / лямдой, но я бы хотел избавиться от set_state.И, возможно, знаете, почему назначение не работает в списке-понимании

Ответы [ 5 ]

4 голосов
/ 09 апреля 2010

Списочные выражения предназначены для создания списков. Похоже, вас не волнуют фактические списки, которые вы составляете, поэтому вы должны просто использовать оператор for, например:

for row in self.__map:
    for c in row:
        c.state |= s
3 голосов
/ 09 апреля 2010

Да, вы используете не тот инструмент. Понимание списка возвращает совершенно новое значение, поэтому вы можете сделать это:

self.__map = [[c.state | s for c in row] for row in self.__map]

Но мой инстинкт заключается в том, что вы должны просто использовать два цикла for:

for row in self.__map:
    for c in row:
        c.state |= s

В понимании списка результат должен быть выражением. Это потому, что ваше двойное понимание просто сахар для этого:

list1 = []
for row in self.__map:
    list2 = []
    for c in row:
        list2.append(c.state | s)
    list1.append(list2)
self.__map = list1

Нет смысла говорить

        list2.append(c.state |= s)

Поскольку самое внутреннее выражение должно возвращать что-то, что будет добавлено к list2.

По сути, списки понимают полную копию себя .__ map каждый раз, когда вы обновляете флаги. Если ты этого хочешь, то иди с этим. Но я подозреваю, что вы просто хотите изменить существующую карту. В этом случае используйте двойные петли for.

1 голос
/ 09 апреля 2010

Вам не нужно понимание списка, поскольку вы изменяете свои данные на месте, а не создаете новый список.

Сделай цикл.

0 голосов
/ 09 апреля 2010

В назначениях на Python есть операторы, а не выражения, которые допускаются только в lambdas и в списках.

0 голосов
/ 09 апреля 2010

Используйте функцию setattr:

setattr(c, "state", s)

А потом читайте Безоговорочный Python .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...