首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将pow(N,levels)元素放入每个级别

将pow(N,levels)元素放入每个级别
EN

Stack Overflow用户
提问于 2013-11-17 14:07:09
回答 2查看 108关注 0票数 1

给出一个列表L = [6,3,87,90,90,90,43,21,1]

我正在创建一个类似树结构的结构,每个级别都在数组中存储pow(2,level)元素。

这是我试过的代码

代码语言:javascript
复制
from collections import defaultdict

def slotify(L):
    level = defaultdict(dict)
    ptr = 0
    try:
        for ref in xrange(len(L)):
            #print ref
            for count in xrange(pow(2,ref)):
                level[ref].update({ptr:L[ptr]})
                ptr += 1
    except (IndexError) as e:
        return level


slotify(L)
Out[297]: defaultdict(<type 'dict'>, {0: {0: 6}, 1: {1: 3, 2: 87}, 2: {3: 90, 4: 90, 5: 90, 6: 43}, 3: {8: 1, 7: 21}})

输出是正确的。

我想知道一个更好的逻辑实现,更好的逻辑代码。谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-17 15:17:04

我会这样做的:

代码语言:javascript
复制
def slotify(L):
    level = []
    counter = 1
    while counter*2 <= len(L):
        level.append(L[counter-1:counter*2-1])
        counter = counter * 2
    level.append(L[counter-1:])
    return level

这个循环遍历这些级别,并将它们插入到“级别”中,除了最后一个级别,它只是添加了剩下的几个级别,因为它可能不一定是一个完整的级别。

您甚至可以更进一步,缓存计数器*2值以保存乘法(根据user2290820的建议改编)

代码语言:javascript
复制
def slotify(L):
    level = []
    counter = 1
    counter_n2 = 2
    while counter_n2 <= len(L):
        level.append(L[counter-1:counter_n2-1])
        counter = counter_n2
        counter_n2 = counter_n2 * 2
    level.append(L[counter-1:])
    return level

你甚至可以更进一步改变

代码语言:javascript
复制
counter_n2 = counter_n2 * 2

代码语言:javascript
复制
counter_n2 += counter_n2

因为python处理事情的方式。

为了获得更高的性能,您可以用+= See comments, another one by user2290820替换附件。

如果您缓存len(L)的返回值,因为您只需要计算它一次,那么您就不必再担心全局查找了。

下面是现在的代码:

代码语言:javascript
复制
def slotify(L):
  level=[]
  counter=1
  counter2=2
  val=len(L)
  while counter2<=val:
    level+=[L[counter-1:counter2-1]]
    counter=counter2
    counter2+=counter2
level+=[L[counter-1:]]
return level

你不会比这更快。

程序流是相同的,只是从第一个优化。

但我得归功于rickhg12hs。我的代码比他的要快(我确信他现在还能再推一次我的),但是他的代码比我的好。(我的看起来有点像c程序了)

票数 2
EN

Stack Overflow用户

发布于 2013-11-17 16:00:51

如果如评论中提到的那样,列表是可以的,下面是我首先尝试的方法。下面是高得多的性能答案。

代码语言:javascript
复制
In [1]:  from math import *

In [2]:  L = [6,3,87,90,90,90,43,21,1]

In [3]: a=L[:]   # make a copy that gets trashed

In [4]: [[a.pop(0) for k in range(min(len(a),2**k1))] for k1 in range(int(log(len(a),2))+1)]
Out[4]: [[6], [3, 87], [90, 90, 90, 43], [21, 1]]

为了获得更多的性能(速度超过3倍):

代码语言:javascript
复制
In [2]: L = [6,3,87,90,90,90,43,21,1]

In [3]: def slotify(L):
    return [L[(1<<k)-1:(1<<(k+1))-1] for k in range(len(L).bit_length())]

In [4]: slotify(L)
Out[4]: [[6], [3, 87], [90, 90, 90, 43], [21, 1]]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20031595

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档