按子列表的长度将列表列表拆分为多个列表
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': []}
一种方法是 sorted
和 itertools.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)
.
更新它
我有一个排序列表,如下所示:
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': []}
一种方法是 sorted
和 itertools.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)
.