获取python中最重要的数字

时间:2015-11-26 22:06:18

标签: python list integer significant-digits

说我有列表[34523, 55, 65, 2]

获取[3,5,6,2]最有效数字的最有效方法是什么?如果可能的话,不改变每个都改为str()

2 个答案:

答案 0 :(得分:13)

假设您只处理正数,您可以将每个数字除以小于该数字的10的最大幂,然后取结果。

>>> from math import log10, floor
>>> lst = [34523, 55, 65, 2]
>>> [floor(x / (10**floor(log10(x)))) for x in lst]
[3, 5, 6, 2]

如果您使用的是Python 3,则可以使用整数除法运算符//来代替结果:

>>> [x // (10**floor(log10(x))) for x in lst]
[3, 5, 6, 2]

但是,我不知道这是否比转换为字符串和切片第一个字符更有效。 (请注意,如果必须处理0到1之间的数字,则需要更复杂。)

>>> [int(str(x)[0]) for x in lst]
[3, 5, 6, 2]

如果这是一个性能关键的代码,你应该测量两个选项,看看哪个更快。如果它不在性能关键的代码中,请使用对您来说最易读的代码。

答案 1 :(得分:2)

我使用python 3.6.1做了一些计时:

range(1, 10_000_000)

如您所见,对于int(str(i)[0])中的数字,def most_significant_while_floordiv(i): while i >= 10: i //= 10 return i 比其他方法更快。我能得到的最接近的是使用简单的while循环:

var deletePromises = [];
arr.menuItems.forEach((item, idx) => {
  if (item.replace) {
     deletePromises.push(deleteFromFirebase(user.uid, item));
  }
});

// Promise 1
Promise.all(deletePromises).then(res1 => {
  var uploadPromises = [],  updateRecordPromises = [];

  arr.menuItems.forEach((item, idx) => {
    uploadPromises.push(uploadToFirebase(user.uid, item));
  });

  // Promise 2
  Promise.all(uploadPromises).then(res2 => {
    arr.menuItems.forEach((item, idx) => {
      item.replace = false;
      updateRecordPromises.push(updateRecord(user.uid, item));
    });

    // Promise 3
    Promise.all(updateRecordPromises).then(res3 => { 
        console.log('All promise execute with successfully');
    });
 });
});