Nhận thời lượng cao nhất từ ​​danh sách các chuỗi


8

Tôi có một danh sách thời lượng như dưới đây

['5d', '20h', '1h', '7m', '14d', '1m']

nơi dđứng trong nhiều ngày, hđứng hàng giờ và mđứng trong vài phút.

Tôi muốn có được thời lượng cao nhất từ ​​danh sách này ( 14dtrong trường hợp này). Làm thế nào tôi có thể có được điều đó từ danh sách các chuỗi này?


1
stackoverflow.com/a/4628148/1224467 Câu trả lời này có một giải pháp để biến chuỗi của bạn thành timedeltas. Đây có thể được sắp xếp.
H4kor

Câu trả lời:


12

Dung dịch trăn nguyên chất. Chúng ta có thể lưu trữ ánh xạ giữa các phần mở rộng thời đại chúng ta ( m, h, d) và phút (ở đây time_map), để tìm thời gian cao nhất. Ở đây chúng tôi đang sử dụng max()với keyđối số để áp dụng ánh xạ của chúng tôi.

inp = ['5d', '20h', '1h', '7m', '14d', '1m']
time_map = {'m': 1, 'h': 60, 'd': 24*60}

print(max(inp, key=lambda x:int(x[:-1])*time_map[x[-1]]))  # -> 14d

14

np.argmaxtrên pd.to_timedelta:

import numpy as np
import pandas as pd

durations = ['5d', '20h', '1h', '7m', '14d', '1m']

durations[np.argmax(pd.to_timedelta(durations))]
Out[24]: '14d'

pd.to_timedeltabiến một chuỗi thành một khoảng thời gian ( nguồn ) và np.argmaxtrả về chỉ mục của phần tử cao nhất.


Mặc dù tôi sẽ không sử dụng numpy và / hoặc gấu trúc cho dự án mà tôi đang gặp phải vấn đề này, nhưng tôi phải nói rằng đó là một ví dụ tuyệt vời về việc sử dụng các chức năng thư viện một cách hiệu quả để hoàn thành công việc của bạn.
Rafiul Sabbir

4

Đây là một bản hack tuyệt đối giúp giải quyết vấn đề theo cách xấu nhưng thông minh: Các hàm minmaxhàm của Python có thể được sử dụng với một keyhàm được sử dụng để so sánh các phần tử, để nó trả về phần tử tối thiểu hóa hoặc tối đa hóa phần tử đó. Nếu keyhàm trả về một tuple, thì thứ tự được xác định bởi thành phần đầu tiên của tuple, sử dụng thành phần thứ hai làm bộ ngắt kết nối.

Chúng ta có thể khai thác thực tế là các ký tự cuối cùng 'd', 'h''m'có thể được so sánh theo thứ tự bảng chữ cái; a d ay dài hơn h h chúng ta dài hơn m m . Điều này có nghĩa là thời lượng dài nhất có ký tự tối thiểu theo thứ tự bảng chữ cái, với số nguyên tối đa là một bộ ngắt kết nối. Tối đa hóa số nguyên đó cũng giống như giảm thiểu phủ định của nó:

>>> durations = ['5d', '20h', '1h', '7m', '14d', '1m']
>>> min(durations, key=lambda d: (d[-1], -int(d[:-1])))
'14d'

Bạn có thể có giây được biểu thị là s, và tuần Wvà tháng như M, và nó vẫn hoạt động; hack phá vỡ nếu bạn bao gồm nhiều năm yhoặc Y, mặc dù. Nó cũng dựa vào việc không có bất kỳ thời lượng nào như 10000000mnơi mà một đơn vị lớn hơn có thể được sử dụng thay thế; Tôi giả sử các chuỗi là đầu ra của một số API luôn sử dụng đơn vị lớn nhất có thể.
kaya3

3
lst = ['5d', '20h', '1h', '7m', '14d', '1m']
max(lst, key=lambda s: (-ord(s[-1]), int(s[:-1])))

Đầu ra:

'14d'

Hữu ích cho bộ chuỗi cụ thể này, nhưng nếu định dạng khác nhau, sẽ cần điều chỉnh phần tử đầu tiên của bộ dữ liệu cho phù hợp. Ngay bây giờ nó có ý nghĩa vì s> m> h> d.


3

đây là một giải pháp với biểu thức chính quy

import numpy as np
import re

new_list = []
x=['5d', '20h', '1h', '7m', '14d', '1m']
map_time={"d":1440, "h":60, "m":1}

for item in x:
    letter=re.findall("[a-zA-Z]+",item)
    number=re.findall("[1-9]+",item)
    new_list.append(map_time[letter[0]]*int(number[0]))

x[np.argmax(new_list)]

2

Với điều kiện là thời gian của bạn được hình thành tốt, bạn có thể tìm thấy max dựa trên một biểu thức chính quy duy nhất:

>>> import re
>>>
>>> durations = ['5d', '20h', '1h', '7m', '14d', '1m']
>>> pattern = re.compile(r'(?:(\d*)d)?(?:(\d*)h)?(?:(\d*)m)?')
>>> max(inp, key=lambda tme: tuple(map(int, pattern.match(tme).groups(default=0))))
'14d'

Biểu thức chính quy tạo ra một chuỗi ngày, giờ, phút dưới dạng chuỗi. Việc tuple(map(int, ...))chuyển đổi nó thành số nguyên. maxchọn số lượng lớn nhất trong số các bộ dữ liệu này, có trọng lượng ngày tự nhiên mạnh hơn số giờ kéo dài hơn phút.


1

Một cách có thể:

duration = ['5d', '20h', '1h', '7m', '14d', '1m', '2d']
duration_std = [0]*len(duration)

equivalence = {"d":60*60*24, "h":60*60, "m":60}

for idx, val in enumerate(duration):
    duration_std[idx] = int(val[:-1])*equivalence[val[-1]]

print(duration[duration_std.index(max(duration_std))])

Đầu ra

"14d"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.