2013-11-27 3 views
3

Привет Я пытаюсь выяснить, где задана длина n списка [x1, x2 ... xn], сколько цифр потребуется для базового 2-го числа чтобы присвоить уникальный код каждому значению в списке.Python найти максимальное количество комбинаций в двоичном формате

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

x1 0 
x2 1 

две цифры может содержать четыре:

x1 00 
x2 01 
x3 10 
x4 11 

и т.д. Я пытаюсь написать функцию питон calcBitDigits (myListLength) который принимает эту длину списка и возвращает количество необходимых цифр. calcBitDigits (2) = 1, calcBitDigits (4) = 2, calcBitDigits (3) = 2 и т.д.

+0

то, что вы ищете математический журнал функции базы 2 (округляется вверх). Вы можете найти кучу разных математических библиотек, чтобы сделать это для вас. –

+1

'x = int (log (n, 2)) + 1' - Это даст вам необходимое количество бит. –

+0

@ Mr.Polywhirl: обратите внимание, что 'math.log' имеет необязательный аргумент' base'. –

ответ

7
>>> for i in range(10): 
... print i, i.bit_length() 
0 0 
1 1 
2 2 
3 2 
4 3 
5 3 
6 3 
7 3 
8 4 
9 4 

Я не ясно, что именно это вы хотите, но это появляется вы хотите вычесть 1 из того, что bit_length() возвращается - или, может быть, не ;-)

на третьей мысли ;-), может быть, вы действительно хотите:

def calcBitDigits(n): 
    return (n-1).bit_length() 

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

Примечание: для целого числа n> 0, n.bit_length() - количество бит, необходимых для представления n в двоичном формате. (n-1).bit_length() - действительно быстрый способ вычисления int(math.ceil(math.log(n, 2))).

Разъяснения: Я понимаю, оригинальный вопрос сейчас ;-) Вот как думать об ответе: если у вас есть n элементов, то вы можете присвоить им уникальные коды с использованием n чисел в 0 через n-1 включительно. Сколько бит это занимает? Количество бит, необходимое для выражения n-1 (самый большой из кодов) в двоичном формате. Я надеюсь, что это делает ответ очевидным, а не таинственным ;-)

Как отмечалось в комментариях, аргумент становится напряженным для n=1. Это причуда, то (0).bit_length() == 0. Так что следи за этим!

+0

Интересная функция ... На самом деле, OP ошибается, и у python это правильно :). Он * делает * принимает 3 бита для хранения 4 - 100. - Кроме того, это намного более питоновское (и эффективное), чем использование журналов, о которых я думаю. – korylprince

+0

@korylprince, это число 4, 2 бит достаточно для 4 _items_ –

+0

@korylprince, да, но я не думаю, что это то, чего действительно хочет OP. –

3

Используйте следующую -

import math 
int(math.ceil(math.log(x,2))) 

где x является длина списка.

Edit:

Для x = 1, мы должны иметь отдельный случай, который будет возвращать 1. Спасибо @thefourtheye для указания этого.

+0

Это тоже неправильно, я думаю. Когда 'x == 1', это возвращает' 0'. OP хочет знать количество цифр, необходимых для назначения уникального кода. Как он может назначить уникальный код с 0 цифрами? – thefourtheye

+0

@thefourtheye, которые должны быть покрыты отдельно. – theharshest

0
x = int(log(n,2))+1 

x будет числом бит, необходимых для хранения целого значения n.

0

Если по какой-то причине вы не хотите использовать .bit_length, вот еще один способ его найти.

from itertools import count 
def calcBitDigits(n): 
    return next(i for i in count() if 1<<i >= n) 
1

Мне не нравятся другие ответы, так как большинство из них терпят неудачу в углу (когда n == 1). Итак, я написал это на основе Tim's answer.

def calcBitDigits(n): 
    if n <= 0: return 0 
    elif n <= 2: return 1 
    return (n-1).bit_length() 

for i in range(10): 
    print i, calcBitDigits(i) 

Выход

0 0 
1 1 
2 1 
3 2 
4 2 
5 3 
6 3 
7 3 
8 3 
9 4 
+0

Упс! Проверьте мое редактирование: у вас было 'return return' в последней части, и я удалил один из них. Но, возможно, вы имели в виду 'else: return' вместо этого. –

+0

@TimPeters О да. Спасибо Тиму :) – thefourtheye

Смежные вопросы