我有一个排序列表,看起来像:
tokens = [[46565], [44460], [73, 2062], [1616, 338], [9424, 24899], [1820, 11268], [43533, 5356], [9930, 1053], [260, 259, 1151], [83, 31840, 292, 3826]]
我想按子列表的长度将其拆分为不同的列表,如下所示:
a = [[46565], [44460]]
b = [[73, 2062], [1616, 338], [9424, 24899], [1820, 11268], [43533, 5356], [9930, 1053]]
c = [[260, 259, 1151]]
d = [[83, 31840, 292, 3826]]
如果不循环整个原始列表并检查每个子列表的长度,我就很难做到这一点
我想也许我可以做点什么:
lengths = list(map(len,tokens))
for k, v in zip(lengths, tokens):
<SOME CODE HERE>
有什么想法吗
这不是最理想的方法,但它遵循了大多数方法
这是输出:
这是你能得到的最有效的方法,而且非常简单:
在此运行之后,
groups
将是一个字典,其中包含子列表长度的键和该长度的所有子列表的值,它们的顺序与在tokens
中找到的顺序相同。然后,如果需要(a = groups[1]
,等等),您可以将这些条目分配给命名变量,但是对于大多数工作流,您最好直接使用groups
字典,因为这概括了解决方案(如果有一个0长度的列表怎么办?15项列表怎么办?)使用单行列表理解无法做到这一点,因为您需要对每个输入值进行不同的聚类。对于聚合(像这样),最好的解决方案几乎总是在输入数据上运行
for
循环,并在输出字典中创建或更新条目字典的
.setdefault
方法对于这种模式也非常有用,因为它省去了在更新条目之前检查条目是否存在的麻烦。或者,您可以使用groups = collections.defaultdict(list)
,然后通过groups[len(sublist)].append(sublist)
更新它一种方法是} :
sorted
和^{相关问题 更多 >
编程相关推荐