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

2024-05-15 03:29:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个排序列表,看起来像:

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>

有什么想法吗


Tags: inmap列表forlenhere排序code
3条回答

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

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

这是你能得到的最有效的方法,而且非常简单:

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)更新它

一种方法是sorted^{}

[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]]]

相关问题 更多 >

    热门问题