Извлечение чисел из строковых литералов в список на основе функции zip в Python - PullRequest
0 голосов
/ 17 октября 2019

У меня есть список строк, которые представляют время в минутах и ​​секундах, например,

distanceList = [0.56, 0.04, 0.56, 0.44, 0.76] #represents distances traveled
timeList = ['5m:11s', '18m:18s', '13m:35s', '8m:26s', '121m:7s'] # represents time to taken to travel

Мне нужно извлечь эти числа (минуты (м) и секунды (с)) и преобразовать в часы.

До сих пор я реализовал функцию zip и использовал некоторое понимание списка, чтобы извлечь числа по отдельности в списки. Однако я не уверен, как суммировать их в часы, учитывая, что они разделены и не всегда согласованы на расстоянии от разделителя толстой кишки. Вот как далеко я прошел.

for a, b in zip(distanceList, timeList):
nums = [item for subitem in b for item in subitem.split() if item.isdigit()]
print nums

Ожидаемые результаты: список целых чисел, представляющих минуты и секунды.

[[5,11],[18,18]...]

Полученные результаты:

['5', '1', '1', '1', '8', '8'....]

Ответы [ 5 ]

1 голос
/ 17 октября 2019

Добавить 5 центов

times = ['5m:11s', '18m:18s', '13m:35s', '8m:26s', '121m:7s']
f = lambda x : int(''.join([i for i in x if i.isdigit()]))
new_times = [[f(s) for u in t.split(":") for s in u.split() ] for t in times]

вывод

[[5, 11], [18, 18], [13, 35], [8, 26], [121, 7]]
1 голос
/ 17 октября 2019

В случае, если «суммирование в часах» все еще актуально: сумма timedelta объектов.

from datetime import timedelta

strings =  ['5m:11s', '18m:18s', '13m:35s', '8m:26s', '121m:7s']

def sum_timestrings(strings):
    min_secs = (s.split(':') for s in strings)
    total = sum((timedelta(minutes=int(m[:-1]), seconds=int(s[:-1]))
                for m, s in min_secs), timedelta())
    return total

total = sum_timestrings(strings)
print(total) # 2:46:37 
print(total.total_seconds()/3600) # 2.7769444444444447 
0 голосов
/ 17 октября 2019

Вы можете использовать понимание списка:

timeList = ['5m:11s', '18m:18s', '13m:35s', '8m:26s', '121m:7s'] # represents time to taken to travel

times = [[int(minute), int(second)]
         for time in timeList
         for lst in [time.split(":")]
         for minute in ["".join([x for x in lst[0] if x.isdigit()])]
         for second in ["".join([y for y in lst[1] if y.isdigit()])]]

print(times)

Что дает

[[5, 11], [18, 18], [13, 35], [8, 26], [121, 7]]


Imo, лучшая альтернатива будет:
import re
timeList = ['5m:11s', '18m:18s', '13m:35s', '8m:26s', '121m:7s'] # represents time to taken to travel

rx = re.compile(r'^(\d+)\D+(\d+)')
result = [m.groups() for item in timeList for m in [rx.search(item)]]
print(result)
0 голосов
/ 17 октября 2019

Ниже

distance_list = [0.56, 0.04, 0.56, 0.44, 0.76]  # represents distances traveled
time_list = ['5m:11s', '18m:18s', '13m:35s', '8m:26s', '121m:7s']  # represents time to taken to travel
time_list1 = [(t[:t.index('m')], t[t.index(':') + 1: t.index('s')]) for t in time_list]
for d, t in zip(distance_list, time_list1):
    print('{} --> {}'.format(d, t))

выход

0.56 --> ('5', '11')
0.04 --> ('18', '18')
0.56 --> ('13', '35')
0.44 --> ('8', '26')
0.76 --> ('121', '7')
0 голосов
/ 17 октября 2019
time_strings = ['5m:11s', '18m:18s', '13m:35s', '8m:26s', '121m:7s']

times = []

for time_string in time_strings:
    tokens = time_string.replace("m", "").replace("s", "").split(":")
    minutes, seconds = map(int, tokens)
    times.append([minutes, seconds])

print(times)

Или:

time_strings = ['5m:11s', '18m:18s', '13m:35s', '8m:26s', '121m:7s']

times = []

for time_string in time_strings:
    tokens = time_string.split(":")
    minutes, seconds = map(int, [token.strip("ms") for token in tokens])
    times.append([minutes, seconds])

print(times)

Вывод:

[[5, 11], [18, 18], [13, 35], [8, 26], [121, 7]]
...