我一直在制作一個對天氣資料行進行排序的程式。需要按時間順序對資料行進行排序。我收到一個天氣線串列,這些天氣線的格式彼此略有不同,并且根據天氣行為和變化發生的速度,該線將以FM或開頭BECMG。
我能夠對列出的時間每次都位于相同索引位置的天氣行進行排序(索引 [0])。例如:
FM131200 20010KT 5000 SHOWERS OF LIGHT RAIN SCT006 BKN010
和
FM131400 20010KT 9999 SHOWERS OF LIGHT RAIN SCT006 FEW030
從上面的兩個示例中,第一個時間顯示的是該月的第 13 天,即 12:00。在第二個是每月的第 14 天和 14:00。這種格式很好,因為時間索引在兩者上都在同一個索引中,但是如果我遇到如下情況,我的排序就不起作用了。
FM131400 20010KT 9999 SHOWERS OF LIGHT RAIN SCT006 BKN010
和
BECMG 1315/1317 27007KT 9999 SHOWERS OF LIGHT RAIN SCT020 BKN030
從上面的例子來看,第一行顯然與前面的例子相同,但第二行在位置(索引 [1])和格式上有所不同。第二行的時間是當月的第 13 天 15:00。
我將此作為我現在如何按時間順序對它們進行排序的示例,但它僅在該行在索引 [0] 處具有時間時才有效。
import re
total_print = ['\nBECMG 1315/1317 27007KT 9999 SHOWERS OF LIGHT RAIN SCT020 BKN030', '\nFM131200 20010KT 9999 SHOWERS OF LIGHT RAIN SCT006 BKN010',
'\nFM131400 20010KT 9999 SHOWERS OF LIGHT RAIN SCT006 BKN010']
data = {
'other': [], # anything with FM or BECMG
}
for line in total_print:
key = 'other'
data[key].append(line)
final = []
data['other'] = sorted(data['other'], key=lambda x: x.split()[0])
for lst in data.values():
for line in lst:
final.append('\n' line[1:])
print(' '.join(final))
這些行以隨機順序提供,有時全部以BECMG或全部以開頭FM,有時兩者兼而有之。所以我需要找到一種方法來對它們進行排序,不管它們是怎么來的。
如何按時間順序對行進行排序,而不管該行是以FM還是BECMG?? 我應該使用正則運算式并隔離時間嗎?任何人都可以幫忙解決這個問題,我被卡住了嗎?
uj5u.com熱心網友回復:
您可以使用正則運算式提取時間,然后將此時間用作“關鍵”進行排序
import re
pattern = r"((?<=FM)\d{6})|(?<=BECMG )\d{4}"
matcher = re.compile(pattern)
data = ['FM131200 20010KT 5000 SHOWERS OF LIGHT RAIN SCT006 BKN010 ',
'FM131400 20010KT 9999 SHOWERS OF LIGHT RAIN SCT006 FEW030',
'BECMG 1315/1317 27007KT 9999 SHOWERS OF LIGHT RAIN SCT020 BKN030',
'FM131400 20010KT 9999 SHOWERS OF LIGHT RAIN SCT006 BKN010']
print(sorted(data, key=lambda item: matcher.search(item).group()))
這將列印:
['FM131200 20010KT 5000 SHOWERS OF LIGHT RAIN SCT006 BKN010 ',
'FM131400 20010KT 9999 SHOWERS OF LIGHT RAIN SCT006 FEW030',
'FM131400 20010KT 9999 SHOWERS OF LIGHT RAIN SCT006 BKN010',
'BECMG 1315/1317 27007KT 9999 SHOWERS OF LIGHT RAIN SCT020 BKN030']
uj5u.com熱心網友回復:
如果該行以 開頭'FM',則時間在該行的第 2、3、4、5 個字符中。如果該行以 BECMG 開頭,則時間在該行的第 6、7、8、9 個字符中。
您可以將其用作排序的鍵:
data = ['\nFM131200 20010KT 5000 SHOWERS OF LIGHT RAIN SCT006 BKN010 ',
'\nFM131400 20010KT 9999 SHOWERS OF LIGHT RAIN SCT006 FEW030',
'\nBECMG 1315/1317 27007KT 9999 SHOWERS OF LIGHT RAIN SCT020 BKN030',
'\nFM131400 20010KT 9999 SHOWERS OF LIGHT RAIN SCT006 BKN010']
data = [s.strip() for s in data]
def sorting_key(s):
if s.startswith('FM'):
return int(s[2:4]), int(s[4:6])
elif s.startswith('BECMG'):
return int(s[6:8]), int(s[8:10])
else:
raise ValueError(''.join(['Neither FM nor BECMG: ', s]))
data = sorted(data, key=sorting_key)
print(data)
# ['FM131200 20010KT 5000 SHOWERS OF LIGHT RAIN SCT006 BKN010',
# 'FM131400 20010KT 9999 SHOWERS OF LIGHT RAIN SCT006 FEW030',
# 'FM131400 20010KT 9999 SHOWERS OF LIGHT RAIN SCT006 BKN010',
# 'BECMG 1315/1317 27007KT 9999 SHOWERS OF LIGHT RAIN SCT020 BKN030']
ValueError當無法正確提取時間時,此代碼將引發:
sorted(['hello'], key=sorting_key)
# ValueError: Neither FM nor BECMG: hello
sorted(['FM13hello'], key=sorting_key)
# ValueError: invalid literal for int() with base 10: 'he'
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/359779.html
