jupyter map lambda result & lt; map на 0x164ecbec7b8 & gt; [Дубликат]

Math.sum (javascript) .... вид замещения оператора

.1 + .0001 + -.1 --> 0.00010000000000000286
Math.sum(.1 , .0001, -.1) --> 0.0001

Object.defineProperties(Math, {
    sign: {
        value: function (x) {
            return x ? x < 0 ? -1 : 1 : 0;
            }
        },
    precision: {
        value: function (value, precision, type) {
            var v = parseFloat(value), 
                p = Math.max(precision, 0) || 0, 
                t = type || 'round';
            return (Math[t](v * Math.pow(10, p)) / Math.pow(10, p)).toFixed(p);
        }
    },
    scientific_to_num: {  // this is from https://gist.github.com/jiggzson
        value: function (num) {
            //if the number is in scientific notation remove it
            if (/e/i.test(num)) {
                var zero = '0',
                        parts = String(num).toLowerCase().split('e'), //split into coeff and exponent
                        e = parts.pop(), //store the exponential part
                        l = Math.abs(e), //get the number of zeros
                        sign = e / l,
                        coeff_array = parts[0].split('.');
                if (sign === -1) {
                    num = zero + '.' + new Array(l).join(zero) + coeff_array.join('');
                } else {
                    var dec = coeff_array[1];
                    if (dec)
                        l = l - dec.length;
                    num = coeff_array.join('') + new Array(l + 1).join(zero);
                }
            }
            return num;
         }
     }
    get_precision: {
        value: function (number) {
            var arr = Math.scientific_to_num((number + "")).split(".");
            return arr[1] ? arr[1].length : 0;
        }
    },
    diff:{
        value: function(A,B){
            var prec = this.max(this.get_precision(A),this.get_precision(B));
            return +this.precision(A-B,prec);
        }
    },
    sum: {
        value: function () {
            var prec = 0, sum = 0;
            for (var i = 0; i < arguments.length; i++) {
                prec = this.max(prec, this.get_precision(arguments[i]));
                sum += +arguments[i]; // force float to convert strings to number
            }
            return Math.precision(sum, prec);
        }
    }
});

Идея состоит в том, чтобы вместо Math вместо Math использовать ошибки плавания

Math.diff(0.2, 0.11) == 0.09 // true
0.2 - 0.11 == 0.09 // false

также отмечают, что Math.diff и Math.sum автоматически определяют точность использования

. Math.sum принимает любое количество аргументов

357
задан vaultah 28 April 2016 в 15:03
поделиться

8 ответов

Сделайте это:

list(map(chr,[66,53,0,94]))

В Python 3+ многие процессы, которые перебирают итераторы, возвращают сами итераторы. В большинстве случаев это приводит к экономии памяти и ускоряет работу.

Если все, что вам нужно сделать, это перебрать этот список в конце концов, нет необходимости даже преобразовывать его в список, потому что вы все равно можете перебирать объект map следующим образом:

# Prints "ABCD"
for ch in map(chr,[65,66,67,68]):
    print(ch)
545
ответ дан Triptych 5 September 2018 в 09:08
поделиться

Я не знаком с Python 3.1, но будет ли это работать?

[chr(x) for x in [66, 53, 0, 94]]
11
ответ дан Andrew Keeton 5 September 2018 в 09:08
поделиться

В дополнение к приведенным выше ответам в Python 3 мы можем просто создать list значений результата из map как

li = []
for x in map(chr,[66,53,0,94]):
    li.append(x)

print (li)
>>>['B', '5', '\x00', '^']

. Мы можем обобщить другой пример, где я был поражен , операции на карте также можно обрабатывать аналогичным образом, как в regex, мы можем написать функцию, чтобы получить list элементов для отображения и получить результат в одно и то же время. Ex.

b = 'Strings: 1,072, Another String: 474 '
li = []
for x in map(int,map(int, re.findall('\d+', b))):
    li.append(x)

print (li)
>>>[1, 72, 474]
0
ответ дан Harry_pb 5 September 2018 в 09:08
поделиться
list(map(chr, [66, 53, 0, 94]))

map (func, * iterables) -> map object Сделать итератор, который вычисляет функцию, используя аргументы из каждого из iterables. Остановка, когда исчерпана самая короткая итерация.

«Сделать итератор»

означает, что он вернет итератор.

", который вычисляет функцию с использованием аргументов из каждого из итераций "

означает, что функция next () итератора будет принимать одно значение каждого итератора и передавать каждый из них в один позиционный параметр function.

Итак, вы получаете итератор из map () funtion и jsut передаете его в список () встроенную функцию или используете списки.

0
ответ дан Invader 5 September 2018 в 09:08
поделиться

Новый и опрятный в Python 3.5:

[*map(chr, [66, 53, 0, 94])]

Благодаря Дополнительные распаковывающие обобщения

57
ответ дан Israel Unterman 5 September 2018 в 09:08
поделиться

Почему вы этого не делаете:

[chr(x) for x in [66,53,0,94]]

Это называется пониманием списка. Вы можете найти много информации о Google, но вот ссылка на документацию Python (2.6) на понимание списков . Однако вас может заинтересовать документация Python 3 .

77
ответ дан Mark Rushakoff 5 September 2018 в 09:08
поделиться

Функция отображения списка с возвратом имеет преимущество сохранения набора текста, особенно во время интерактивных сеансов. Вы можете определить функцию lmap (по аналогии с python2's imap), которая возвращает список:

lmap = lambda func, *iterable: list(map(func, *iterable))

Тогда вызов lmap вместо map выполнит задание: lmap(str, x) короче на 5 символов (30% в этом случае), чем list(map(str, x)) и, конечно, короче [str(v) for v in x]. Вы также можете создавать похожие функции для filter.

Был комментарий к исходному вопросу:

Я бы предложил переименовать в Get Map (), чтобы вернуть список в Python 3. *, как это применимо ко всем версиям Python3. Есть ли способ сделать это? - meawoppl 24 января в 17:58

Возможно, это , но это очень плохая идея. Просто для удовольствия, вот как вы можете (но не должны) делать это:

__global_map = map #keep reference to the original map
lmap = lambda func, *iterable: list(__global_map(func, *iterable)) # using "map" here will cause infinite recursion
map = lmap
x = [1, 2, 3]
map(str, x) #test
map = __global_map #restore the original map and don't do that again
map(str, x) #iterator
18
ответ дан Michael Goldshteyn 5 September 2018 в 09:08
поделиться

Преобразование моего старого комментария для лучшей видимости: для «лучшего способа сделать это» без map целиком, если ваши входы, как известно, являются ординалами ASCII, обычно гораздо быстрее конвертировать в bytes и декодировать, a la bytes(list_of_ordinals).decode('ascii'). Это дает вам str значений, но если вам нужно list для изменчивости или тому подобное, вы можете просто преобразовать его (и он все же быстрее). Например, в ipython микрообъектах, преобразующих 45 входов:

>>> %%timeit -r5 ordinals = list(range(45))
... list(map(chr, ordinals))
...
3.91 µs ± 60.2 ns per loop (mean ± std. dev. of 5 runs, 100000 loops each)

>>> %%timeit -r5 ordinals = list(range(45))
... [*map(chr, ordinals)]
...
3.84 µs ± 219 ns per loop (mean ± std. dev. of 5 runs, 100000 loops each)

>>> %%timeit -r5 ordinals = list(range(45))
... [*bytes(ordinals).decode('ascii')]
...
1.43 µs ± 49.7 ns per loop (mean ± std. dev. of 5 runs, 1000000 loops each)

>>> %%timeit -r5 ordinals = list(range(45))
... bytes(ordinals).decode('ascii')
...
781 ns ± 15.9 ns per loop (mean ± std. dev. of 5 runs, 1000000 loops each)

Если вы оставите его как str, это займет ~ 20% от времени самых быстрых map решений; даже конвертируя обратно в список, он по-прежнему составляет менее 40% от самого быстрого решения map. Массовое преобразование через bytes и bytes.decode, тогда объемное преобразование обратно в list экономит много работы, , но , как отмечено, работает только, если все ваши входы являются ординалами ASCII (или ординалами в некотором байта на конкретное кодирование для каждого символа, например latin-1).

3
ответ дан ShadowRanger 5 September 2018 в 09:08
поделиться
Другие вопросы по тегам:

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