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

时间:2020-03-18 19:01:34

标签: python list sorting sublist

我有一个看起来像这样的排序列表:

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>

有什么想法吗?

3 个答案:

答案 0 :(得分:3)

一种方法是将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]]]

答案 1 :(得分:2)

这大约是您所能获得的,并且非常简单:

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)

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

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

字典的.setdefault方法对于此模式也非常有用,因为它免除了您在更新条目之前检查条目是否存在的麻烦。另外,您可以使用groups = collections.defaultdict(list),然后通过groups[len(sublist)].append(sublist)对其进行更新。

答案 2 :(得分:0)

这不是最理想的方式,但是遵循了大多数方式。

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': []}