2012-05-13 68 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') 
相关问题