【问题标题】:How can I extract integers from a list of strings to create a formula?如何从字符串列表中提取整数来创建公式?
【发布时间】:2020-06-09 18:02:11
【问题描述】:
timeList = ['7m:13s', '11m:29s', '16m:48s', '3m:26s', '120m:0s']

如何从该列表中获取分钟和秒数?我希望能够创建一个公式来计算每小时英里数。

【问题讨论】:

  • 你想从列表中得到什么最终结果,你只是想为元素 0 说出 713 吗?

标签: python string list methods


【解决方案1】:

如果要根据时间计算速度,则需要距离。如果您希望它以英里/小时为单位,您需要将这些时间转换为小时数(或分数)。这可以在列表理解中完成:

timeList = ['7m:13s', '11m:29s', '16m:48s', '3m:26s', '120m:0s']

# converting to hours
hours = [(m*60+s)/3600 for ms in timeList for m,s in [map(int,ms[:-1].split("m:"))]]

#computing speeds:
distance = 1 # mile
mph      = [distance/time for time in hours]

print(mph)

# [8.314087759815243, 5.2249637155297535, 3.571428571428571, 17.475728155339805, 0.5]

如果您的距离在匹配列表中,您可以使用 zip 获取每个条目的速度:

miles = [ 10, 5, 8, 9 ]
mph   = [distance/time for distance,time in zip(miles,hours)]

# [83.14087759815243, 26.124818577648767, 28.57142857142857, 157.28155339805826]

您可以将两者组合成一行,但它会很丑陋且难以维护:

mph = [distance*3600/(m*60+s) for distance,ms in zip(miles,timeList) for m,s in [map(int,ms[:-1].split("m:"))]]

【讨论】:

  • 我正在尝试从这个 timeList 和一个距离列表创建一个 zip 列表,如何在同一个循环中添加这个公式?例如距离列表 distanceList = [0.04, 0.05, 0.91, 0.16, 18]
【解决方案2】:

遍历timeList并从中提取分钟和秒部分并将其转换为整数以供进一步处理。

timeList = ['7m:13s', '11m:29s', '16m:48s', '3m:26s', '120m:0s']
for element in timeList:
    min = int(str(element).split(":")[0].split("m")[0])
    sec = int(str(element).split(":")[1].split("s")[0])
    print(min,sec)

【讨论】:

    【解决方案3】:

    从每个项目中删除 ms,然后在 : 上拆分。

    timeList = ['7m:13s', '11m:29s', '16m:48s', '3m:26s', '120m:0s']
    
    for item in timeList:
        minutes, seconds = item.replace('m', '').replace('s', '').split(':')
        minutes, seconds = int(minutes), int(seconds)
        print(minutes, seconds)
    

    输出:

    7 13
    11 29
    16 48
    3 26
    120 0
    

    【讨论】:

      【解决方案4】:

      解决方案

      您可以使用 str('7m:13s').split(':') 对这两个部分进行切片,然后分别处理分钟和秒部分,如下所示。

      json 库允许您缩进您的字典打印并使其更易于阅读输出。

      不过,您也可以使用pandas.DataFrame 将输出显示为表格。

      既然你提到了计算速度,让我为行驶距离(以英里为单位)制作一些虚拟数据,并用它来计算速度(以英里/小时为单位)。

      distances = ['0.5', '1.2', '3.8', '10.0', '100.0']
      

      以下解决方案以小时为单位计算时间并评估速度。

      代码

      import json
      import pandas as pd
      
      timeList = ['7m:13s', '11m:29s', '16m:48s', '3m:26s', '120m:0s']
      
      # dummy data for distance (in miles)
      distances = ['0.5', '1.2', '3.8', '10.0', '100.0']
      
      # We will save the time-spans in a
      # dictionary post-processing
      time_spans = dict()
      
      for i, (ts, distance) in enumerate(zip(timeList, distances)):
          tmin, tsec = ts.split(':')
          time_spans.update({i: {'distance': float(distance),
                                 'timespan': ts,
                                 'minutes': int(tmin[:-1]),
                                 'seconds': int(tsec[:-1]),
                                 }})
      # Print the dictionary (uncomment if necessary)
      #print(json.dumps(time_spans, indent=2))
      
      # Print DataFrame: As a table
      df = pd.DataFrame(time_spans).T
      # Calculate elapsed time (in hours)
      df['time'] = df['minutes']/60 + df['seconds']/(60*60)
      # Calculate speed: distance/time (in miles/hour)
      df['speed'] = df['distance']/df['time']
      
      print(df)
      

      熊猫数据框

        distance timespan minutes seconds       time    speed
      0      0.5   7m:13s       7      13   0.120278  4.15704
      1      1.2  11m:29s      11      29   0.191389  6.26996
      2      3.8  16m:48s      16      48       0.28  13.5714
      3       10   3m:26s       3      26  0.0572222  174.757
      4      100  120m:0s     120       0          2       50
      

      【讨论】:

        【解决方案5】:

        更新:

        如果不清楚的话,我是 python 的初学者。

        我想使用列表理解并将我所有的方法和作业放在一行中,但这让我很难理解。我的最终代码逐步完成了整个过程。可能不是最有效的方法,但我能够弄清楚。

        我使用切片、剥离和拆分将我的数字从字符串中取出,然后将每个数字转换为所需的单位。

        distanceList = [0.04, 0.05, 0.91, 0.16, 18]
        timeList = ['7m:13s', '11m:29s', '16m:48s', '3m:26s', '120m:0s']
        
        
        zipList = zip(distanceList, timeList)
        for i in zipList:
            distance = i[0]
            time = i[1]
            numbers = time.split("m:")
            minute = numbers[0]
            sec = numbers[1].strip("s")
            hoursmin = (float(minute) / 60)
            hourssec = (float(sec) / 3600)
            hours = (hoursmin + hourssec)
            mph = (distance / hours)
            print("Distance: ", distance, "Time: ", time, "Speed: ", round(mph, 2), "miles/hr")
        

        输出:

        ('Distance: ', 0.04, 'Time: ', '7m:13s', 'Speed: ', 0.33, 'miles/hr')
        ('Distance: ', 0.05, 'Time: ', '11m:29s', 'Speed: ', 0.26, 'miles/hr')
        ('Distance: ', 0.91, 'Time: ', '16m:48s', 'Speed: ', 3.25, 'miles/hr')
        ('Distance: ', 0.16, 'Time: ', '3m:26s', 'Speed: ', 2.8, 'miles/hr')
        ('Distance: ', 18, 'Time: ', '120m:0s', 'Speed: ', 9.0, 'miles/hr')
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-08-16
          • 1970-01-01
          • 1970-01-01
          • 2017-03-11
          • 2020-07-06
          • 2017-07-07
          相关资源
          最近更新 更多