2012-05-13 70 views
5

我有一個列表元素的python列表,其中包含一個字母和數字的字符串的列表,我想知道如何我可以在開始時由字符分割列表該字符串不會爲每個字符創建一個語句。 所以我想將mylist分爲列表a,b和c。由每個元素中的字符分割python列表

mylist = [['a1'],['a2'],['c1'],['b1']] 
a = [['a1'],['a2']] 
b = [['b1']] 
c = [['c1']] 

重要的是,我將它們作爲列表列表(儘管它只是每個小列表中的單個元素)。

感謝

回答

4

這將工作:

import itertools as it 

mylist = [['a1'],['a2'],['c1'],['b1']] 
keyfunc = lambda x: x[0][0] 

mylist = sorted(mylist, key=keyfunc) 
a, b, c = [list(g) for k, g in it.groupby(mylist, keyfunc)] 

在使用sorted()該生產線是必要的只有在mylist元素尚未由字符字符串的開始排序。

編輯:

正如在評論中指出,一個更通用的解決方案(一個不限制到三個變量的數目),將使用字典解析(在Python提供2.7+)像這樣的:

result_dict = {k: list(g) for k, g in it.groupby(mylist, keyfunc)} 

現在的答案是由第一個字符在字典中鍵入:

result_dict['a'] 
> [['a1'],['a2']] 

result_dict['b'] 
> [['b1']] 

result_dict['c'] 
> [['c1']] 
+1

不錯的解決方案,但也許應該清楚,如果列表中有'd1',代碼會崩潰。也就是說,用'result_dict = {k:list(g)for k,g in.groupby(mylist,keyfunc)}'替換最後一行會更好,然後將字母作爲鍵和列表作爲項目。 .. – deinonychusaur

+0

@deinonychusaur感謝您的建議!我更新了我的答案。 –

2

使用字典可以工作得

mylist = [['a1'],['a2'],['c1'],['b1']] 

from collections import defaultdict 

dicto = defaultdict(list) 

for ele in mylist: 
    dicto[ele[0][0]].append(ele) 

結果:

>>> dicto 
defaultdict(<type 'list'>, {'a': [['a1'], ['a2']], 'c': [['c1']], 'b': [['b1']]}) 

它不給你問的確切結果;然而,這是很容易訪問與每個字母

>>> dicto['a'] 
[['a1'], ['a2']] 
+0

我+1這個因爲它適用於任何數量的起始字符,所以你不限於'a','b','c'。 –

0

您還可以通過使用簡單的功能得到這些子列表關聯列表的列表:

def get_items(mylist, letter): 
    return [item for item in mylist if item[0][0] == letter] 

表達item[0][0]只是意味着獲得當前項目的第一個元素的第一個字母。然後你可以調用每個字母的函數:

a = get_items(mylist, 'a') 
b = get_items(mylist, 'b') 
c = get_items(mylist, 'c') 
相關問題