【问题标题】:Python - return a region of a list based on calculated percentagesPython - 根据计算的百分比返回列表的区域
【发布时间】:2011-03-14 18:43:31
【问题描述】:

我在 python 中有一个相当长的列表,我想在一个基于 3 个百分比的较短列表中返回其中的一部分。如果第一个百分比是 30%,它需要返回前 30% 的值,如果第三个百分比是 50%,它需要返回我的长列表的后一半值。

这是我目前所拥有的,它存在舍入问题并且是一个丑陋的解决方案

  class OM():
    def __init__(self,name):
      self.name = name
      self.total = 120
      self.a = 21
      self.b = 34
      self.c = 65

    def hRange(self,action):
      if self.total > 0:
        a_perc = int(self.a / float(self.total) *169)
        b_perc = int(self.b / float(self.total) *169)
        c_perc = int(self.c / float(self.total) *169)
        if action=='a': return lst[:aperc]
        elif action=='b': return lst[a_perc:a_perc+b_perc]
        elif action=='c': return lst[-c_perc:]

      else:
        raise Exception

我意识到这根本没有很好的编码,(将第一个长度硬编码为 169,没有捕捉到不同的动作等)我只是想帮助解释我想要做什么。

在我的实际实现中,值 total,a,b,c 将被初始化为 0,而另一种方法会更新它们,因为它们只是计数。我只是在这里将它们设置为一些随机值,以便代码返回百分比。

如果有人能给我任何关于如何以更好的方式做这件事的建议,我将不胜感激。

【问题讨论】:

    标签: python list


    【解决方案1】:

    如果我理解正确,您想保留三个列表,基于开始和结束的某个百分比加上“中间”:

    def split_list(mylist, a, b):
        l = len(mylist)
        return ( mylist[:int(a*l/100)], 
                 mylist[int(a*l/100):-int(b*l/100)],
                 mylist[-int(b*l/100):] )
    

    其中 a 和 b 是百分比(从 0 到 100)。它与您的实现几乎相同,但您只需要使用两个百分比(如果中间列表是两端都被修剪掉的剩余部分)。我将由您自行决定将其合并到您的代码中...

    【讨论】:

    • 啊谢谢你,你说得对——我只需要两个百分比,实际上我根本不需要计算 c 或总数。我只是意识到我的百分比变量甚至不是百分比,我的尝试非常糟糕:P
    • 是的,您唯一要添加的是一种机制,用于检查百分比不超过 100%,并且根据您的需要,它们不重叠(即 a = 65 , b = 65)。
    【解决方案2】:

    被一个通用的解决方案冲昏了头脑......我相信这应该可以处理所有情况:

    def split_list(mylist, *args):
        ilist = map(lambda p : int(p * len(mylist) / 100.0), args) + [len(mylist)]
        return reduce(lambda l, v : [l[0] + [mylist[l[1]:v]], v], ilist, [[],0])[0]
    

    该函数接受一个列表和一个百分比分割点列表(按顺序),并根据需要返回列表。处理拆分百分比多于列表中的项目的情况。

    【讨论】:

    • 哇,谢谢!这是非常令人印象深刻的!我已经阅读了 map、reduce、filter、lambda 和 list comprehension。首先要了解这个功能是如何工作的,其次是因为它们非常有用!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-15
    • 2021-09-13
    • 2021-10-17
    • 1970-01-01
    相关资源
    最近更新 更多