繁体   English   中英

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

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

如果s是数字list

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

Output:

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

但是,像Andrej's answer中那样进行排序可能更有效,因为这意味着更少的交换。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM