2017-06-30 100 views
1

所以我有2個列表第一個來自我的數據集幷包含格式爲'yyyy-mm-dd hh:mm'的日期時間,名爲times。例如:在Python中列表交集和部分字符串匹配

'2010-01-01 00:00', '2010-01-01 00:15', '2010-01-01 00:30', ..., 

另一種是所有特殊的一年一個月組合,命名爲year_and_month的列表。例如:

'2010-01', '2010-02', '2010-03', '2010-04', 

所以我嘗試提取原始數據集中年份組合的所有索引。我這樣做,用最糟糕的方式(在蟒蛇新),即

each_member_indices = [] 
for i in range(len(year_and_month)): 
    item_ind = [] 
    for j in range(times.shape[0]): 
     if year_and_month[i] in times[j]: 
      item_ind.append(j) 

each_member_indices.append(item_ind) 

現在,這是用了那麼多的時間來工作核彈。因此,我希望優化它一下,因此我一直在尋找在一些實施方式中,如 Find intersection of two lists?Python: Intersection of full string from list with partial string問題在於

res_1 = [val for val in year_and_month if val in times] 

產生空列表,而

res_1 = [val for val in year_and_month if val in times[0]] 

產生所述第一構件至少。

有什麼想法?

編輯:

我只需要從名爲times相應的year_and_month名單的唯一年月對原始數據集的元素的索引。因此,作爲要求的樣本輸出將

[[0, 1, 2, 3,...],[925, 926, ...],...] 

第一子列表包含了對2010年一月的指數,第二次爲2010年二月等等。

+1

你能爲你的輸入顯示一個想要的輸出樣本嗎? –

+0

你是對的!正當我在看解決方案時,我發現我通過for循環獲得了我想要的內容,但列表理解卻沒有達到同樣的目的。爲了回答你的問題,ima得到一個列表,即'each_member_indices',它是'[[0,1,2,..],[924,925,...],...]'每個對應於唯一年份的子列表例如,第一個子列表是2010年1月期間的所有指數。 – Kots

回答

0

要做到線性時間,你可以建立一個查找字典映射年份和月份組合索引。您還可以使用collections.defaultdict,使之更容易一點:

from collections import defaultdict 

d = defaultdict(list) 
for i, v in enumerate(times): 
    d[v[:7]].append(i) 

然後,你可以創建一個列表解析結果列表:

result = [d[x] for x in year_and_month] 

演示:

>>> from collections import defaultdict 
>>> times = ['2010-01-01 00:00', '2010-01-01 00:15', '2010-02-01 00:30', '2010-03-01 00:00'] 
>>> year_and_month = ['2010-01', '2010-02', '2010-03', '2010-04'] 
>>> d = defaultdict(list) 
>>> for i, v in enumerate(times): 
...  d[v[:7]].append(i) 
...  
>>> dict(d) 
{'2010-01': [0, 1], '2010-02': [2], '2010-03': [3]} 
>>> [d[x] for x in year_and_month] 
[[0, 1], [2], [3], []] 
+0

因此,如果我想提取'2010年 - 01'我應該可以寫'd ['2010-01']'。但是,當我做'result = [d [x] for x year_and_month]'這給了我一個列表,其中'len(result)== len(times)'。不過,我寧願選擇一個「結果」列表,其長度與獨特的年份組合相同,即與演示中的結果相同。這可能是一個問題來自事實,我使用python 3? – Kots

+0

也許,'times'中的每個元素都有獨特的年份呢? [list comprehension](https://docs.python.org/3.6/tutorial/datastructures.html#list-comprehensions)會創建一個與輸入大小相同的新列表。 –

0

也許嘗試使用任何?

[val for val in year_and_month if any(val in t for t in times)] 
+0

**注意**我沒有嘗試你的原始代碼,也不知道你正在尋找什麼輸出 – NightHallow

+1

有一些警告;)也許一個澄清問題的評論會更好 –

0

爲什麼不用字典創建一個新的結構,並按year_and_month排序呢?

result = {} 
for i, v in enumerate(times): 
    result.setdefault(v[:7], []).append(i) 
for i in year_and_month: 
    print(i, result[i]) #will print the year_month with all the indices of that year_month 
0

好吧,這給出了常見元素:

ls = str(times) 
r = [x for x in year_and_month if (x in ls)] 
print r