Python, создающий словарь списков

Если вы хотите получить доступ к данным от родителя CompositeView, вы можете сделать несколько разных вещей.

  1. Либо передайте эти данные непосредственно в ItemView через вспомогательную функцию itemViewOptions в CompositeView. Примечание: эта опция была изменена на childViewOptions в марионетке 2.

  2. Вызвать метод непосредственно для всех дочерних представлений из CompositeView и передать все, что вы хотите, в этот метод.

  3. Запустить событие или прослушать его с помощью ItemView.

Ни одна из этих опций не имеет прямого доступа к родительскому представлению от ребенка, но должна делать то, что вы хотите. Ниже приведен код того, как использовать каждый из этих подходов для передачи модели CompositeView в представление детей.

// Pass model into ItemView on init
var MyItemView = Backbone.Marionette.ItemView.extend({
  initialize : function (options) {
    this.parentsModel = options.parentsModel;
  }
});
var MyCompView = Backbone.Marionette.CompositeView.extend({
  itemViewOptions : function () { return { parentsModel: this.model }; }
  itemView : MyItemView
});


// Invoke function on ItemView, passing data in
var MyItemView = Backbone.Marionette.ItemView.extend({
  doSomethingWithParent : function (parentModel) {
    // do cool thing with parentModel
  }
});
var MyCompView = Backbone.Marionette.CompositeView.extend({
  itemView : MyItemView,
  onRender : function () {
    this.children.call("doSomethingWithParent", this.model);
  }
});


// Trigger event that ItemView knows about
var MyItemView = Backbone.Marionette.ItemView.extend({
  initialize : function () {
    this.listenTo(this, "special:event", function (parentModel) {
      // Do cool things
    });
  }
});
var MyCompView = Backbone.Marionette.CompositeView.extend({
  itemView : MyItemView,
  onRender : function () {
    this.children.each(_.bind(function (childView) {
      childView.trigger("special:event", this.model);
     }, this));
  }
});
206
задан Johnathan Au 14 July 2016 в 08:38
поделиться

4 ответа

Вы можете использовать defaultdict :

>>> from collections import defaultdict
>>> d = defaultdict(list)
>>> a = ['1', '2']
>>> for i in a:
...   for j in range(int(i), int(i) + 2):
...     d[j].append(i)
...
>>> d
defaultdict(<type 'list'>, {1: ['1'], 2: ['1', '2'], 3: ['2']})
>>> d.items()
[(1, ['1']), (2, ['1', '2']), (3, ['2'])]
269
ответ дан 23 November 2019 в 04:49
поделиться

Вы можете построить его с пониманием списка, как это :

>>> dict((i, range(int(i), int(i) + 2)) for i in ['1', '2'])
{'1': [1, 2], '2': [2, 3]}

И для второй части вашего вопроса используйте defaultdict

>>> from collections import defaultdict
>>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
>>> d = defaultdict(list)
>>> for k, v in s:
        d[k].append(v)

>>> d.items()
[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]
50
ответ дан 23 November 2019 в 04:49
поделиться

Используйте setdefault :

d = dict()
a = ['1', '2']
for i in a:
    for j in range(int(i), int(i) + 2): 
        d.setdefault(j, []).append(i)

print d  # prints {1: ['1'], 2: ['1', '2'], 3: ['2']}

Функция с довольно странным названием setdefault говорит: «Получить значение с помощью этого ключа, или, если этот ключ не является» t, добавьте это значение и затем верните его. "

Edit : Как справедливо отметили другие, defaultdict - лучший и более современный выбор. setdefault по-прежнему полезен в более старых версиях Python (до 2.5).

30
ответ дан 23 November 2019 в 04:49
поделиться

На ваш вопрос уже был дан ответ, но IIRC вы можете заменить строки вроде:

if d.has_key(scope_item):

на:

if scope_item in d:

То есть d ссылки d.keys () в этой конструкции. Иногда defaultdict не лучший вариант (например, если вы хотите выполнить несколько строк кода после else , связанного с вышеупомянутым if ), и Я считаю, что синтаксис в легче читать.

2
ответ дан 23 November 2019 в 04:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: