【问题标题】:Classify a list of numbers based on their values in Python根据 Python 中的值对数字列表进行分类
【发布时间】:2020-09-30 20:50:53
【问题描述】:

我正在尝试在 python 中编写一个循环,该循环读取一个包含 50 个数字的文本文件,并对这些数字进行排序,并根据它们的值将它们分配给不同的变量。我希望变量 A 包含小于 2 的值,变量 B 包含从 2 到 2.1 的值,变量 c 包含从 2.1 到 2.25 的值,变量 d 包含从 2.25 到 2.5 的值,变量 e 包含从2.25 到 2.5。

到目前为止,我的代码如下所示:

import os
import numpy
os.chdir('/Users/DevEnv')

dispFile = open('output1.txt')
displacement = dispFile.readlines()
dispFile.close()

displacement = [float(i.strip()) for i in displacement]


for i in range (0,50):
   displacementval = displacement[i]
   if i<2 displacementval()=a():

但是,当我尝试运行它时,我得到一个无效的语法错误。我是 python 和编程的新手,如果有任何帮助,我将不胜感激!

【问题讨论】:

  • a 变量来自哪里?
  • a 是我想创建的一个变量来存储小于 2 的值
  • 似乎 displacmentval 中的值已经被实例化了。
  • 那是你的实际代码吗?有语法错误-请清理>

标签: python for-loop


【解决方案1】:

您需要将变量abcde初始化为list

import os
import numpy
os.chdir('/Users/DevEnv')

dispFile = open('output1.txt')
displacement = dispFile.readlines()
dispFile.close()

displacement = [float(i.strip()) for i in displacement]

a = []
b = []
c = []
d = []
e = []

for displacementval in displacement:
   if displacementval < 2:
        a.append(displacementval)
   elif displacementval < 2.1:
        b.append(displacementval)
   # ... the rest is similar, so omitted
print a
print b

我建议阅读官方的Python tutorial,这样你就可以先了解一下 Python 语法。

【讨论】:

    【解决方案2】:

    当您掌握了上述适合初学者的解决方案后,请考虑查看bisect

    您可以通过对链接示例进行一些语义修改来解决您的问题。

    from bisect import bisect
    
    def grade(score, breakpoints=[2, 2.1, 2.25, 2.5], marks='abcde'):
            i = bisect(breakpoints, score)
            return marks[i]
    
    a,b,c,d,e = [], [], [] ,[], []
    lists = [a,b,c,d,e]
    marks='abcde'
    
    r = map(lambda x: x / 10.0, range(0, 501, 1))
    
    for item in [(grade(score),score) for score in r ]:
        l = marks.index(item[0])
        lists[l].append(item[1])
    

    grade() ,对于给定的数字会问,如果要在断点中插入它会在什么索引处?它将返回标记[索引]。例如,如果你给它一个分数,它会计算出 1 属于 2 之前的断点索引 0,所以它会返回 mark[0]=a。

    print 语句将为您提供一个包含(字母标记,标记分配给的值)的元组列表。

    正如我所说,这是更高级的,您应该在掌握基本概念后尝试理解它,但值得考虑一下。

    【讨论】:

    • 很好的解决方案!但我建议以问题中的原始数据为例,因此不需要numpy(因为默认情况下它不附带Python)。
    • 谢谢,我需要一个快速的方法来演示浮点范围,你知道 STL 是否默认支持?
    • 本帖讨论了多种方法:stackoverflow.com/a/7267287/1292238
    • @azalea 谢谢,很简单,用列表调度编辑
    【解决方案3】:
    import os
    import numpy
    os.chdir('/Users/DevEnv')
    
    dispFile = open('output1.txt')
    displacement = dispFile.readlines()
    dispFile.close()
    
    displacement = [float(i.strip()) for i in displacement]
    a = []
    b = []
    c = []
    d = []
    e = []
    
    for i in displacement:
        if i <2:
            a.append(i)
        elif i < 2.1:
            b.append(i)
        elif i < 2.25:
            c.append(i)
        elif i< 2.5:
            d.append(i)
        else:
            e.append(i)
    

    不要忘记实例化列表,if i&lt;2 displacementval()=a(): 这行没有任何意义。

    【讨论】:

      【解决方案4】:

      这里有几个问题,但我会尽力引导您解决这些问题。 首先,您说您需要 5 个变量:a、b、c、d、e,并且每个变量都应该包含一个值列表。为此,我们必须首先将每个 声明为一个 list,在 Python 中它只是一个值的集合。这看起来像这样:

      a = []
      b = []
      c = []
      d = []
      e = []
      

      接下来在我们的 for 循环中,我们需要比较这些值并相应地对它们进行排序,如下所示:

      for i in range(0, 50):
          displacementval = displacement[i]
          if displacementval < 2:
              a.append(displacementval)
          elif displacementval < 2.1:
              b.append(displacementval)
          elif displacementval < 2.25:
              c.append(displacementval)
          elif displacementval < 2.5:
              d.append(displacementval)
              e.append(displacementval)
      

      一点解释:当我们使用 a_list.append(a_value) 时,我们将该值添加到列表的末尾。此外,我们的 if 语句只是检查某事是否为真,然后转到下一个 elif。所以如果一个值不

      希望这会有所帮助!

      【讨论】:

      • @azalea 在“其他”情况下的行为会是什么?
      • 您当前的解决方案将相同的值附加到列表de
      • @azalea 问题说应该将 2.25 和 2.5 之间的值添加到 de
      • @azalea 哈哈,不用担心。我最初也忽略了它:)
      【解决方案5】:

      或者,您可以将所有类别保存在一个列表字典中,而不是为每个类别设置一个单独的变量。这是代码。

      from collections import defaultdict
      def get_category(i):
          if i < 2:
              return'a'
          elif i < 2.1:
              return 'b'
          elif i < 2.25:
              return 'c'
          elif i < 3:
              return 'd'
      
      displ_categories = defaultdict(list)
      for i in displacement:
          category = get_category(i)
          displ_categories[category].append(i)
      

      结果字典的格式为:

      {'a': [0.42, 1.01, 0.118, 0.807, 0.225, 1.307, 1.151, 0.824],
       'd': [2.716, 2.255]}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-26
        • 1970-01-01
        • 2013-12-05
        • 1970-01-01
        • 2019-02-25
        相关资源
        最近更新 更多