假设我有两个列表:
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)
整体问题能否以通用方式解决?
这似乎有效:
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的值.