首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将循环替换为列表理解,而不是循环获取函数以返回列表理解中的新数组

将循环替换为列表理解,而不是循环获取函数以返回列表理解中的新数组
EN

Stack Overflow用户
提问于 2012-09-27 22:35:24
回答 2查看 1.9K关注 0票数 1

基本上,我在尝试避免在代码看起来像这样之前遍历大的数组:

代码语言:javascript
复制
for rows in book:
        bs = []
        as = []
        trdsa = []
        trdsb = []
        for ish in book:
            var = (float(str(ish[0]).replace(':',"")) - float(str(book[0]).replace(':',"")))
            if var < .1 and var > 0 :
                bs.append(int(ish[4]))
                as.append(int(ish[5]))
                trdsa.append(int(ish[-2]))
                trdsb.append(int(ish[-1]))
                time = ish[0]
            bflow = sum(numpy.diff(bs))
            aflow = sum(numpy.diff(as))
            OFI = bflow - aflow - sum(trdsb) + sum(trdsa)
            OFIlist.append([time,bidflow,askflow,OFI])

我不想遍历列表两次,因为它消耗了太多的时间。我在想我可以做一个列表理解,但我不确定我是否在正确的轨道上

代码语言:javascript
复制
OFIcreate(x,y):
    bs = []
    as = []
    trdsa = []
    trdsb = []
    var = (float(str(y[0]).replace(':',"")) - float(str(x[0]).replace(':',"")))
    if var < .1 and var >= 0 :
        bs.append(int(ish[4]))
        as.append(int(ish[5]))
        trdsa.append(int(ish[-2]))
        trdsb.append(int(ish[-1]))
        time = ish[0]
    bflow = sum(numpy.diff(bs))
    aflow = sum(numpy.diff(as))
    OFI = bflow - aflow - sum(trdsb) + sum(trdsa)
    OFIlist.append([time,bidflow,askflow,OFI])
    return OFIlist

    OFIc = [ OFIcreate(x,y) for x in book for y in book)

问题是,我希望遍历列表并对其中var、>=0和var <.1的所有实例进行分组,然后将值追加到一个新列表中。以我现在的方式,我认为它不会这样做,因为它会一直创建长度为1的列表。你有什么办法让我做到这一点吗?或者更确切地说,我如何才能使第一块代码更高效?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-27 23:14:27

虽然列表理解的解释速度确实比常规循环快,但它们并不是万能的。我不认为你可以用列表理解来代替你的主for循环。然而,可能还有一些改进的空间:

  • 你可以通过列表理解来建立一个time的列表。

  • 你可以通过列表理解来计算var的列表,并将其转换为np.array

var = np.array(t.replace(':',',') for t in time,dtype=float) var -= float(str(book).replace(":",",“))

  • 你可以为bsas构建4个数字整数数组(需要来重命名,as是一个Python然后可以过滤你的bs...具有奇特索引的数组:

bs_reduced = bs(var < 0.1) & (var >=0)

票数 1
EN

Stack Overflow用户

发布于 2012-09-27 22:48:27

,我不想遍历列表两次,因为它消耗了太多的时间。我在想我可以做一个列表理解,但我不确定我是否在正确的轨道上

可能不会。列表理解除了遍历给定的列表之外什么也不做,所以它应该不会产生明显的差异。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12623835

复制
相关文章

相似问题

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