2017-08-27 150 views
2

排序我有幾個小時的天氣信息串的SH **Ÿ列表,在這裏它是:Python列表與字符串

bad_list =['00:00', '-2°C', '-6°C', '320°13 Km/h', 'N/A', '74%', '-6°C', '1025,0mb', '', 
'01:00', '-1°C', '-3°C', '320°6 Km/h', 'N/A', '75%', '-5°C', '1024,0mb', '', 
'02:00', '-3°C', '-5°C', '270°6 Km/h', 'N/A', '86%', '-5°C', '1023,0mb', '', 
.....(skipped hours from 03 till 09) 
'09:04', '9°C', '5°C', '290°35 Km/h', 'N/A', '66%', '3°C', '1022,0mb', '', 
'10:00', '9°C', '5°C', '290°37 Km/h', 'N/A', '62%', '2°C', '1022,0mb', '', 
'10:27', '10°C', '6°C', '280°39 Km/h', 'N/A', '58%', '2°C', '1023,0mb', '', 
'11:02', '11°C', '11°C', '290°35 Km/h', 'N/A', '54%', '2°C', '1022,0mb', '', 
'11:10', '12°C', '12°C', '290°37 Km/h', 'N/A', '47%', '1°C', '1022,0mb', '', 
    .....(skipped) 
'23:00', '3°C', '3°C', 'N/A', '52%', '-6°C', '1020,0mb', '', 
] 

的問題是,在列表中,小時字符串是凌亂的,如例子有'10:00'和'10:27'。我正在嘗試的是每小時(從00:00到23:00)收集臨時(一小時後的下一個索引字符串)。一個小時內有超過24個字符串(和相應的天氣信息!)在該列表中。 所以我想找到一個小時的第一次出現,然後從列表中爲相應的溫度得到下一個索引:

unique_time = ['00:','01:','02:','03:','04:','05:','06:','07:','08:','09:','10:','11:','12:','13:','14:','15:','16:', 
     '17:','18:','19:','20:','21:','22:','23:'] 

sorted_time_list = next(x for x in unique_time if x in bad_list) #not working 

並獲得相應的bad_list於sorted_time_list +1指數字符串。我知道這聽起來很醜,但我想要24小時獲得臨時字符串(第二個元素在bad_list後的小時字符串)。

我知道這聽起來有點不清楚。如果需要更多的詳細信息,請拍我:)

+0

在你的例子中,第一個元素總是時間,數據以9個爲一組,所以'bad_list [1 :: 9]'怎麼樣? –

回答

4

集團的項目爲9個項目(使用grouper iterator),然後各組的小時組:

from itertools import groupby, zip_longest 

def grouper(iterable, n, fillvalue=None): 
    args = [iter(iterable)] * n 
    return zip_longest(*args, fillvalue=fillvalue) 

by_hour = groupby(grouper(bad_list, 9), lambda g: g[0][:2]) 

temp_list = [(hour, next(entries)[1]) for hour, entries in by_hour] 

由此產生的(hour, temp)元組,其中一個列表產生給定小時的第一溫度。您給定的數據

演示:

>>> from itertools import groupby, zip_longest 
>>> def grouper(iterable, n, fillvalue=None): 
...  args = [iter(iterable)] * n 
...  return zip_longest(*args, fillvalue=fillvalue) 
... 
>>> by_hour = groupby(grouper(bad_list, 9), lambda g: g[0][:2]) 
>>> [(hour, next(entries)[1]) for hour, entries in by_hour] 
[('00', '-2°C'), ('01', '-1°C'), ('02', '-3°C'), ('09', '9°C'), ('10', '9°C'), ('11', '11°C'), ('23', '3°C')] 
+1

你是我的英雄!感謝百萬隊友! –

0

我在python初出茅廬,我嘗試用自己的方法來解決這個問題。 其次是我的代碼。

final_result={} 
for x, y in enumerate(unique_time): 
    if (y in bad_list): 
     final_result[y]=bad_list[x+1] 
print(final_result)