В python существует ли сжатый способ вставки словаря в список в соответствии с возрастающим порядком одного значения словаря? [Дубликат]

Порядок свойств в нормальных объектах является сложным объектом в Javascript.

Пока в ES5 явно не указан порядок, ES2015 имеет порядок в определенных случаях. Это следующий объект:

  o = Object.create (null, {m: {value: function () {}, enumerable: true}, "2": {value: "2  ", перечисляемое: true}," b ": {value:" b ", enumerable: true}, 0: {значение: 0, перечислимое: true}, [Symbol ()]: {значение:" sym ", перечислимое:  true}, "1": {value: "1", enumerable: true}, "a": {значение: "a", перечислимое: true},});   

Это приводит к следующему порядку (в некоторых случаях):

  Объект {0: 0, 1: "1", 2: "2"  , b: "b", a: "a", Symbol (): "sym"}  
  1. целые ключи в порядке возрастания
  2. normal ключи в порядке вставки
  3. Символы в порядке вставки

Таким образом, существует три сегмента, которые могут изменить порядок вставки (как это было в примере).

Вопрос в том, какие методы этот порядок гарантирован в спецификации ES2015?

Следующие методы гарантируют показанный порядок:

  • Object.assign
  • Object.defineProperties
  • Object.getOwnPropertyNames
  • Object.getOwnPropertySymbols
  • Reflect.ownKeys

Следующие методы / петли не гарантируют никакого порядка:

  • Object.keys
  • для
  • JSON.parse
  • JSON.stringify

Вывод: даже в ES2015 вы не должны полагаться на порядок свойств нормального объектов в Javascript. Он подвержен ошибкам. Вместо этого используйте Map .

9
задан Craig McQueen 19 February 2010 в 01:24
поделиться

4 ответа

Обычный шаблон здесь похож на сортировку по атрибуту, украшение, управление и undecorate. Поэтому в этом случае вам просто нужно украсить, а затем позвонить. Однако вы бы хотели избежать этого, так как украшение будет O (n), тогда как вы хотите, чтобы это было O (logn). Поэтому я бы лучше рассмотрел ваш метод.

3
ответ дан Alex Gaynor 17 August 2018 в 09:48
поделиться
6
ответ дан GrantJ 17 August 2018 в 09:48
поделиться

Что вы можете сделать, это

class OffsetWithAttributes( object ):
    def __init__( self, offset, **kw ):
        self.offset= offset
        self.attributes= kw
    def __eq__( self, other ):
        return self.offset == other.offset
    def __lt__( self, other ):
        return self.offset < other.offset
    def __le__( self, other ):
        return self.offset <= other.offset
    def __gt__( self, other ):
        return self.offset > other.offset
    def __ge__( self, other ):
        return self.offset >= other.offset
    def __ne__( self, other ):
        return self.offset != other.offset

Это должно позволить вам создать простой list экземпляров OffsetWithAttributes. Алгоритм bisect должен быть полностью счастлив использовать определенные операторы.

Вы можете использовать свой someOWA.attributes['data'].

Или

    def __getattr__( self, key ):
        return self.attributes[key]

Это должно сделайте OffsetWithAttributes больше похожим на dict.

4
ответ дан S.Lott 17 August 2018 в 09:48
поделиться

Когда вы говорите, что реальные данные могут быть намного длиннее, это мешает вам хранить список значений смещения под рукой?

offset_values = [i['offset'] for i in test_data]
bisect.bisect(offset_values, 1900)

Ваш метод кажется мне хорошим.

4
ответ дан sykora 17 August 2018 в 09:48
поделиться
Другие вопросы по тегам:

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