如何创建具有某些特定值的行为的字典

sma*_*n09 4 python dictionary

假设我有两个列表:

l1 = [['b', (1, 1)], ['b', (1, 2)], ['b', (1, 3)], ['a', (1, 5)],
      ['b', (2, 1)], ['b',(3, 1)]]

l2 = ['A','B','C']
Run Code Online (Sandbox Code Playgroud)

如何创建这种格式的字典?

dct = {'A': len(sublist1), 'B': len(sublist2), 'C' : len(sublist3)}
Run Code Online (Sandbox Code Playgroud)

哪里

sublist1 = [['b', (1, 1)], ['b', (1, 2)], ['b', (1, 3)], ['a', (1, 5)]]
sublist2 = [['b', (2, 1)]]
sublist3 = [['b',(3, 1)]]
Run Code Online (Sandbox Code Playgroud)

如果我的l1如下所示会发生什么:

ls1 = [[(1, 1), (1, 2), (1, 3), (1, 4), (2, 1), (2, 2)]]    
Run Code Online (Sandbox Code Playgroud)

然后我的输出应该是:

dct = {'A': len(sublist1), 'B': len(sublist2)}
Run Code Online (Sandbox Code Playgroud)

哪里

sublist1 = [[(1, 1),(1, 2),(1, 3),(1, 4)]]
sublist2 = [[(2, 1),(2, 2),(2, 3)]]
Run Code Online (Sandbox Code Playgroud)

整体问题能否以通用方式解决?

Lau*_*low 8

这似乎有效:

from itertools import groupby

key = lambda x: x[1][0]
lens = [len(list(g)) for k, g in groupby(sorted(l1, key=key), key=key)]
dct = dict(zip(l2, lens))
Run Code Online (Sandbox Code Playgroud)

当我假设A匹配1时,我希望我推断正确,B代表2,依此类推.

回复:OP编辑

我不知道(2, 3)你的物品sublist2来自哪里,我认为这是一个错误.此外,我假设单个元素列表ls1实际上是元组的直接容器,因为这里使用嵌套列表没有任何意义.如果是这样,这是我对通用解决方案的建议:

from itertools import groupby
from string import ascii_uppercase

key = lambda x: x[0]
lens = [len(list(g)) for k, g in groupby(sorted(l1, key=key), key=key)]
dct = dict(zip(ascii_uppercase, lens))
Run Code Online (Sandbox Code Playgroud)

所以,没有大的变化.zip当给定不等长度的参数时,该函数将返回一个与最短参数长度相同的列表,这种行为在这种情况下适合我们.

请记住,如果第一个元组元素的值超过26个,那么此解决方案将会中断,并且只是忽略任何大于26的值.