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]]
虽然这有点矫枉过正,但我们可以使用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)
请注意,这将返回列表的副本,而不是原始列表.此外,所有行应具有相同数量的项目.
groupby和islice如果按字典顺序排列列表,那么我们可以使用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)