首页 > 解决方案 > 如何按子列表的长度对 3 个或更多列表列表进行排序

问题描述

我一直在从事一项涉及三元组的 NLP 任务,即来自文本语料库的 3 个连续字母的字符串。我有三个列表列表。第一个由两种语言的各种组合常见的频繁出现的三元组组成。第二个由他们在语言 1 中的计数组成。第三个由语言 3 中的计数组成。

我想对这些列表进行排序,将具有最多共同三元组的列表放在顶部。

让我们看一下这些列表的示例:

for i, j, k in zip(trigrams, lang1_counts, lang2_counts):
    print(i,j,k)

['er_', 'n_d', '_de', 'in_', 'en_'] [1087, 1213, 2038, 903, 3855] [2996, 969, 2226, 951, 3872]
['in_', '_in', 'er_'] [903, 937, 1087] [1101, 1369, 1080]
['et_', 'de_', '_de', '_en'] [1314, 2359, 2038, 769] [880, 2254, 2881, 787]

如您所见,第一个三元组列表的长度分别为 5,3,4。我想对其进行排序,使其变为 5、4、3。对于绘图,还必须对三元组的计数进行排序。这只是一个小样本;我还有很多这样的清单。列表的列表具有相同的长度。

到目前为止,我已经尝试过这些解决方案,但都不起作用:

trigrams, lang1_counts, lang2_counts = zip(*sorted(zip(trigrams, lang1_counts, lang2_counts), key=len, reverse=True))

trigrams, lang1_counts, lang2_counts = (list(t) for t in zip(*sorted(zip(trigrams, lang1_counts, lang2_counts), key=len, reverse=True)))

谁能看到他们为什么不工作并提出一些建议?给定的方法不会引发错误;它们根本没有效果。

我的参考资料是:

如何根据子列表的长度对列表列表 进行排序 如何以完全相同的方式对两个列表(相互引用)进行排序

标签: pythonpython-3.xlistsortingnlp

解决方案


尝试这个

trigrams, lang1_counts, lang2_counts = zip(
    *sorted(zip(trigrams, lang1_counts, lang2_counts), key=lambda x: len(x[0]), reverse=True))

您应该根据len第一个元素的长度而不是压缩元组的长度进行排序,在这些情况下,所有这些都是 3


推荐阅读