按子列表的长度将列表列表拆分为多个列表

Splitting a list of lists into multiple lists by length of sub list

我有一个排序列表,如下所示:

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>

有什么想法吗?

这不是最佳方式,但遵循了大部分方式。

import string

alphabets = string.ascii_lowercase

tokens = [[46565], [44460], [73, 2062], [1616, 338], [9424, 24899], [1820, 11268], [43533, 5356], [9930, 1053], [260, 259, 1151], [83, 31840, 292, 3826]]

numbering = {(ord(k)-96):k for k in alphabets}
output = {k:[] for k in alphabets}


lengths = list(map(len,tokens))

for k, v in zip(lengths, tokens):
    output[numbering[k]].append(v)

print(output)

这是输出:

{'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]], 'e': [], 'f': [], 'g': [], 'h': [], 'i': [], 'j': [], 'k': [], 'l': [], 'm': [], 'n': [], 'o': [], 'p': [], 'q': [], 'r': [], 's': [], 't': [], 'u': [], 'v': [], 'w': [], 'x': [], 'y': [], 'z': []}

一种方法是 sorteditertools.groupby:

[list(v) for _ ,v in groupby(sorted(tokens, key=len), key=len)]

[[[46565], [44460]],
 [[73, 2062],
  [1616, 338],
  [9424, 24899],
  [1820, 11268],
  [43533, 5356],
  [9930, 1053]],
 [[260, 259, 1151]],
 [[83, 31840, 292, 3826]]]

这已经是您所能达到的最高效率了,而且非常简单:

tokens = [
    [46565], [44460], [73, 2062], [1616, 338], 
    [9424, 24899], [1820, 11268], [43533, 5356], 
    [9930, 1053], [260, 259, 1151], 
    [83, 31840, 292, 3826]
]
groups = {}
for sublist in tokens:
    groups.setdefault(len(sublist), []).append(sublist)

在此 运行s 之后,groups 将是一个字典,其中包含子列表长度的键和该长度的所有子列表的值,按照它们在 tokens。然后,您可以根据需要将这些条目分配给命名变量(a = groups[1],等等),但对于大多数工作流程,您最好直接使用 groups 字典,因为这样可以概括解决方案(What如果有一个 0 长度的列表?一个 15 项的列表呢?)。

无法通过单行列表理解来执行此操作,因为您需要对每个输入值进行不同的聚类。对于聚合(像这样),最好的解决方案几乎总是 运行 对输入数据进行 for 循环并在输出字典中创建或更新条目。

字典的.setdefault方法对这种模式也很有用,因为它省去了更新前检查条目是否存在的麻烦。或者,您可以使用 groups = collections.defaultdict(list),然后通过 groups[len(sublist)].append(sublist).

更新它