Как преобразовать список индексов в двоичное число?

Я хочу добавить к ответам выше, потому что у вас могут быть разные намерения от Javascript. Объект JSON и объект Javascript - это разные вещи, и вы можете захотеть итерации через свойства объекта JSON с помощью предложенных выше решений, а затем удивляться.

Предположим, что у вас есть объект JSON, например:

var example = {
    "prop1": "value1",
    "prop2": [ "value2_0", value2_1"],
    "prop3": {
         "prop3_1": "value3_1"
    }
}

Неправильный путь для итерации через его «свойства»:

function recursivelyIterateProperties(jsonObject) {
    for (var prop in Object.keys(example)) {
        console.log(prop);
        recursivelyIterateProperties(jsonObject[prop]);
    }
}

Возможно, удивлен, увидев ведение журнала консоли 0, 1 и т. д. при повторении через свойства prop1 и prop2 и prop3_1. Эти объекты являются последовательностями, а индексы последовательности являются свойствами этого объекта в Javascript.

Лучший способ рекурсивной итерации через свойства объекта JSON состоял в том, чтобы сначала проверить, является ли этот объект последовательностью или нет :

function recursivelyIterateProperties(jsonObject) {
    for (var prop in Object.keys(example)) {
        console.log(prop);
        if (!(typeof(jsonObject[prop]) === 'string')
            && !(jsonObject[prop] instanceof Array)) {
                recursivelyIterateProperties(jsonObject[prop]);

            }

     }
}
1
задан Martijn Pieters 28 March 2019 в 10:40
поделиться

1 ответ

Вы можете использовать сдвиг битов, чтобы установить конкретные биты, и двоичные или |, чтобы объединить их:

>>> bin(1 << 2)
0b100
>>> bin(1 << 0)
0b1
>>> bin(1 << 0 | 1 << 2)
0b101

Это позволяет устанавливать биты для каждой записи в списке:

[ 111]

Для больших чисел использование reduce и map может быть быстрее:

>>> from functools import reduce  # loop-augmented-assignment
>>> from operator import __or__  # the | operator
>>>
>>> #         / result |= ...        / 1 << position 
>>> #         v                      v
>>> reduce(__or__, map(lambda pos: 1 << pos, my_list))
5
0
ответ дан MisterMiyagi 28 March 2019 в 10:40
поделиться
Другие вопросы по тегам:

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