Python 按每个元素的第一个字符拆分列表

Python 按每个元素的第一个字符拆分列表,python,list,group-by,split,python-2.7,Python,List,Group By,Split,Python 2.7,我有一个Python列表mylist,其元素是包含字母和数字字符串的子列表。我想知道如何在字符串开头按字符拆分mylist,而不使用每个字符带有单独语句/大小写的代码。 假设我要将我的列表拆分为列表a、b、c: mylist = [['a1'],['a2'],['c1'],['b1']] a = [['a1'],['a2']] b = [['b1']] c = [['c1']] 重要的是,我将它们作为列表列表保存(即使每个子列表中只有一个元素)。这将起作用: import itertools

我有一个Python列表
mylist
,其元素是包含字母和数字字符串的子列表。我想知道如何在字符串开头按字符拆分
mylist
,而不使用每个字符带有单独语句/大小写的代码。 假设我要将我的列表拆分为列表
a、b、c

mylist = [['a1'],['a2'],['c1'],['b1']]
a = [['a1'],['a2']]
b = [['b1']]
c = [['c1']]
重要的是,我将它们作为列表列表保存(即使每个子列表中只有一个元素)。

这将起作用:

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)]
仅当
mylist
中的元素尚未按字符串开头的字符排序时,才需要使用
sorted()

编辑:

正如评论中指出的,一个更通用的解决方案(不将变量数量限制为三个)是使用字典理解(在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']]

使用字典也可以

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']]})

您还可以使用一个简单的函数获取这些子列表:

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')

I+1这是因为它可以处理任意数量的起始字符,所以您不限于
a
b
c
。这是一个不错的解决方案,但也许应该明确指出,如果列表中有“d1”,代码将崩溃。也就是说,最好将最后一行替换为
result_dict={k:list(g)for k,g.groupby(mylist,keyfunc)}
,然后将字母作为键,列表作为项…@deinonychusaur感谢您的建议!我更新了我的答案。无需编写
mylist=sorted(mylist,…)
,只需在适当的位置执行
mylist.sort(…)
。最好将结果存储在dict中,键入第一个字母(按照奥斯卡·洛佩斯的答案),而不是单独硬编码的变量名
a、b、c.
;最好不要理会那个要求。
a = get_items(mylist, 'a')
b = get_items(mylist, 'b')
c = get_items(mylist, 'c')