我有一个 Python 列表mylist
,其元素是一个包含字母和数字字符串的子列表。我想知道如何mylist
在不使用每个字符的单独语句/案例的代码的情况下按字符串开头的字符进行拆分。假设我想将 mylist 拆分为列表a, b, c
:
mylist = [['a1'],['a2'],['c1'],['b1']]
a = [['a1'],['a2']]
b = [['b1']]
c = [['c1']]
重要的是我将它们保留为列表列表(即使它只是每个子列表中的单个元素)。
我有一个 Python 列表mylist
,其元素是一个包含字母和数字字符串的子列表。我想知道如何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)]
仅当 in 中的元素尚未按字符串开头的字符排序时,使用where 的行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']]
使用字典也可以
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']]
您还可以使用一个简单的函数来获取这些子列表:
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')