过滤列表中的两个第一个匹配元素

Bac*_*Bad 4 python iteration list filter python-3.x

我有一个按升序排序的列表列表,类似于这个:

input = [[1,1],[1,2],[1,3],[1,4],[2,1],[2,2],[2,3],[3,1],[6,1],[6,2]]
Run Code Online (Sandbox Code Playgroud)

我想过滤此列表,以便新列表只包含位置0中匹配整数的前两个(或唯一)元素,如下所示:

output = [[1,1],[1,2],[2,1],[2,2],[3,1],[6,1],[6,2]]
Run Code Online (Sandbox Code Playgroud)

如果其余元素(不符合标准的元素)将保留在输入列表中,而匹配元素将单独存储,那将是理想的.

我该怎么做呢?

先感谢您!

编辑:索引1上的元素实际上可以是任何整数,例如 [[1,6],[1,7],[1,8],[2,1],[2,2]]

Wil*_*sem 6

熊猫

虽然这有点矫枉过正,但我​​们可以使用pandas:

import pandas as pd

pd.DataFrame(d).groupby(0).head(2).values.tolist()
Run Code Online (Sandbox Code Playgroud)

随着d原始列表.然后产生:

>>> pd.DataFrame(d).groupby(0).head(2).values.tolist()
[[1, 1], [1, 2], [2, 1], [2, 2], [3, 1], [6, 1], [6, 2]]
Run Code Online (Sandbox Code Playgroud)

请注意,这将返回列表的副本,而不是原始列表.此外,所有行应具有相同数量的项目.

Itertools groupbyislice

如果按字典顺序排列列表,那么我们可以使用itertools.groupby:

from operator import itemgetter
from itertools import groupby, islice

[e for _, g in groupby(d, itemgetter(0)) for e in islice(g, 2)]
Run Code Online (Sandbox Code Playgroud)

这再次产生:

>>> [e for _, g in groupby(d, itemgetter(0)) for e in islice(g, 2)]
[[1, 1], [1, 2], [2, 1], [2, 2], [3, 1], [6, 1], [6, 2]]
Run Code Online (Sandbox Code Playgroud)

由于我们将引用复制到列表中,因此它也更灵活,并且所有列表可以具有不同数量的元素(这里至少有一个).

编辑

通过islice以相反的方式工作,可以获得其余的值:保留除第一个之外的所有内容:

[e for _, g in groupby(d, itemgetter(0)) for e in islice(g, 2, None)]
Run Code Online (Sandbox Code Playgroud)

然后我们获得:

>>> [e for _, g in groupby(d, itemgetter(0)) for e in islice(g, 2, None)]
[[1, 3], [1, 4], [2, 3]]
Run Code Online (Sandbox Code Playgroud)