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

6

我有一个 Python 列表 mylist,它的元素是包含字母和数字的子列表。我想知道如何在不使用针对每个字符的单独语句/情况的代码的情况下,通过字符串开头的字符拆分 mylist。 假设我想将 mylist 拆分成列表 a, b, c:

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

重要的是我将它们作为列表的列表来保留(即使每个子列表中只有一个元素)。


最好将结果存储在一个字典中,以第一个字母为键(根据Óscar López的答案),而不是使用单独的硬编码变量名a,b,c...;最好忽略该要求。 - smci
3个回答

7
这将起作用:
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']]

2
不错的解决方案,但也许应该明确指出,如果列表中有一个“d1”,代码将会崩溃。话虽如此,最好将最后一行替换为result_dict = {k: list(g) for k, g in it.groupby(mylist, keyfunc)},这样字母就成为键,列表成为项... - deinonychusaur
很好。没必要写成 mylist = sorted(mylist, ...) 的形式,只需要使用 mylist.sort(...) 就可以原地排序了。 - smci

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

我+1这个,因为它适用于任何数量的起始字符,所以你不仅限于abc - Burhan Khalid

1

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接