Я хочу добавить к ответам выше, потому что у вас могут быть разные намерения от 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]);
}
}
}
Вы можете использовать сдвиг битов, чтобы установить конкретные биты, и двоичные или |
, чтобы объединить их:
>>> 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