列表理解以获得相同值的二维列表

List comprehension to get a 2D list of the same values

我有以下数字:

arr = [4, 5, 5, 5, 6, 6, 4, 1, 4, 4, 3, 6, 6, 3, 6, 1, 4, 5, 5, 5]

我想创建一个列表理解,它将匹配我在二维列表数组中的所有相同值,例如:

[[1, 1], [3, 3], [4, 4, 4, 4, 4], [5, 5, 5, 5, 5, 5], [6, 6, 6, 6, 6]]

我试过类似的方法:

listArr = sorted(arr)

不幸的是,我不知道如何将排序后的数字放入二维列表数组中。

您可以创建临时字典来对数字进行分组:

s = "4 5 5 5 6 6 4 1 4 4 3 6 6 3 6 1 4 5 5 5"

out = {}
for d in s.split():
    out.setdefault(d, []).append(int(d))

out = sorted(out.values())
print(out)

打印:

[[1, 1], [3, 3], [4, 4, 4, 4, 4], [5, 5, 5, 5, 5, 5], [6, 6, 6, 6, 6]]

如果 slist 个数字:

out = {}
for d in s:
    out.setdefault(d, []).append(d)

out = sorted(out.values())
print(out)

itertools.groupby:

from itertools import groupby

arr = [4, 5, 5, 5, 6, 6, 4, 1, 4, 4, 3, 6, 6, 3, 6, 1, 4, 5, 5, 5]

out = [[*gr] for _, gr in groupby(sorted(arr))]

其中分组键是排序数组中的值本身,组是连续值。 [*gr] 是一种从这些值中形成列表的方法,也可以在其中使用 list(gr)

获得

>>> out

[[1, 1], [3, 3], [4, 4, 4, 4, 4], [5, 5, 5, 5, 5, 5], [6, 6, 6, 6, 6]]
s = "4 5 5 5 6 6 4 1 4 4 3 6 6 3 6 1 4 5 5 5"
l = list(map(int, s.split()))
output = [[val] * l.count(val) for val in set(l)]

输出:

[[1, 1], [3, 3], [4, 4, 4, 4, 4], [5, 5, 5, 5, 5, 5], [6, 6, 6, 6, 6]]

排序后可以使用itertools.groupby.

>>> L = [4, 5, 5, 5, 6, 6, 4, 1, 4, 4, 3, 6, 6, 3, 6, 1, 4, 5, 5, 5]
>>> from itertools import groupby
>>> [list(group) for _key, group in groupby(sorted(L))]
[[1, 1], [3, 3], [4, 4, 4, 4, 4], [5, 5, 5, 5, 5, 5], [6, 6, 6, 6, 6]]

但是,像 那样在之后排序可能更有效,因为这意味着更少的交换。