2013-08-27 63 views
0

我有這樣一個清單:分割清單分成塊的條件

["asdf-1-bhd","uuu-2-ggg","asdf-2-bhd","uuu-1-ggg","asdf-3-bhd"] 

,我想分成兩組誰的元素相等後,我取出數:

"asdf-1-bhd", "asdf-2-bhd", "asdf-3-bhd" 
"uuu-2-ggg" , uuu-1-ggg" 

我有在使用itertools.groupby

for key, group in itertools.groupby(elements, key= lambda x : removeIndexNumber(x)): 

但這並不時進行分組的元素的工作都沒有缺點ecutive。

我曾考慮過使用列表推導,但這似乎是不可能的,因爲組的數量不固定。

TL;博士:

我想組的東西,有兩個問題:

  1. 我不知道塊的數目,我會獲得
  2. 我將要歸爲元素一個塊可能是不連續的
+0

總是有兩個結果列表,或者可能有任何數量的結果列表嗎? – DPM

+0

任意數目的結果列表:我不知道我將獲得的塊數 –

回答

3

爲什麼你不這麼想。您可以映射everyting到字典:

import re 
from collections import defaultdict 
regex = re.compile('([a-z]+\-)\d(\-[a-z]+)') 

t = ["asdf-1-bhd","uuu-2-ggg","asdf-2-bhd","uuu-1-ggg","asdf-3-bhd"] 

maps = defaultdict(list) 

for x in t: 
    parts = regex.match(x).groups() 
    maps[parts[0]+parts[1]].append(x) 

輸出:

[['asdf-1-bhd', 'asdf-2-bhd', 'asdf-3-bhd'], ['uuu-2-ggg', 'uuu-1-ggg']] 

這是非常快,因爲你沒有一件事比作另一個。

編輯:

在不同

思考你最初的方法是通過每個項目進行迭代,並將它們彼此比較。這是過度複雜和不必要的。

讓我們來考慮一下我的代碼的作用。首先它得到精簡版本:

"asdf-1-bhd" -> "asdf--bhd" 
"uuu-2-ggg" -> "uuu--ggg" 
"asdf-2-bhd" -> "asdf--bhd" 
"uuu-1-ggg" -> "uuu--ggg" 
"asdf-3-bhd" -> "asdf--bhd" 

您已經可以開始查看這些組,並且我們還沒有比較任何東西!

我們現在做一種反向映射。我們採取正確的一切事物,並使它成爲一個關鍵,並在左邊任何東西,把它放在通過其左側值映射列表:我們有我們的小組通過定義

'asdf--bhd' -> ['asdf-1-bhd', 'asdf-2-bhd', 'asdf-3-bhd'] 
'uuu--ggg' -> ['uuu-2-ggg', 'uuu-1-ggg'] 

而且有自己的通用計算值(鍵)。這將適用於任何數量的元素和組。

+0

好吧,我現在明白了。您創建一個將剝離的字符串作爲鍵的映射。我想我的解決方案比我的更好。 –

+0

請參閱我編輯的答案。 – korylprince

0

好,簡單的解決方案(必須是爲時已晚在這裏):

使用itertools.groupby,但首先是sort的列表。

至於上面給出的例子:

elements = ["asdf-1-bhd","uuu-2-ggg","asdf-2-bhd","uuu-1-ggg","asdf-3-bhd"] 
elemens.sort(key = lambda x : removeIndex(x)) 
for key, group in itertools.groupby(elements, key= lambda x : removeIndexNumber(x)): 
    for element in group: 
     # do stuff 

正如你可以看到,對於分選的條件是一樣的分組。這樣,最終必須分組的元素首先被連續排列。完成此操作後,itertools.groupy可以正常工作。