Python 从元组列表中获取前3个元素
下面是由Category、Tag、TagCount组成的元组列表。它们按类别和标记计数排序Python 从元组列表中获取前3个元素,python,Python,下面是由Category、Tag、TagCount组成的元组列表。它们按类别和标记计数排序 [(u'Agriculture', u'Farming', 3L), (u'Agriculture', u'Business', 2L), (u'Agriculture', u'Animal', 2L), (u'Agriculture', u'Illness', 1L), (u'Agriculture', u'Health', 1L), (u'Agriculture', u'Disability', 1L
[(u'Agriculture', u'Farming', 3L), (u'Agriculture', u'Business', 2L), (u'Agriculture', u'Animal', 2L), (u'Agriculture', u'Illness', 1L), (u'Agriculture', u'Health', 1L), (u'Agriculture', u'Disability', 1L),
(u'Agriculture', u'Carers', 1L), (u'Employment', u'Money', 1L), (u'Employment', u'Business', 1L),
(u'Employment', u'Tax', 1L), (u'Employment', u'Debt', 1L), (u'Employment', u'Budget', 1L),
(u'Environment', u'Business', 2L), (u'Environment', u'Animal', 2L), (u'Environment', u'Trees', 2L)]
我希望能够得到每个类别中的前3个元组。所以我想回去
[(u'Agriculture', u'Farming', 3L), (u'Agriculture', u'Business', 2L), (u'Agriculture', u'Animal', 2L),
(u'Employment', u'Money', 1L), (u'Employment', u'Business', 1L), (u'Employment', u'Tax', 1L),
(u'Environment', u'Business', 2L), (u'Environment', u'Animal', 2L), (u'Environment', u'Trees', 2L)]
我知道我可以使用for循环和计数器来实现这一点,但我觉得使用lambdas可能会有一种我完全不知道的简单方法
以下是我的作品:
output = []
counter = 1
last_category = ''
for res in results:
category = res[0]
if category != last_category: counter = 1
if category == last_category:
if counter <= 3:
output.append(res)
counter +=1
last_category = category
output=[]
计数器=1
最后一类=“”
对于结果中的res:
类别=res[0]
如果是类别!=最后一类:计数器=1
如果类别==最后一个类别:
如果计数器您可以使用列表理解来完成:
res = [y for y in a if y[2] in sorted([x[2] for x in a if x[0] == y[0]])[-3:]]
它假定a
是元组列表
输出:
[(u'Agriculture', u'Farming', 3L),
(u'Agriculture', u'Business', 2L),
(u'Agriculture', u'Animal', 2L),
(u'Employment', u'Money', 1L),
(u'Employment', u'Business', 1L),
(u'Employment', u'Tax', 1L),
(u'Employment', u'Debt', 1L),
(u'Employment', u'Budget', 1L),
(u'Environment', u'Business', 2L),
(u'Environment', u'Animal', 2L),
(u'Environment', u'Trees', 2L)]
您可以使用列表理解来完成此操作:
res = [y for y in a if y[2] in sorted([x[2] for x in a if x[0] == y[0]])[-3:]]
它假定a
是元组列表
输出:
[(u'Agriculture', u'Farming', 3L),
(u'Agriculture', u'Business', 2L),
(u'Agriculture', u'Animal', 2L),
(u'Employment', u'Money', 1L),
(u'Employment', u'Business', 1L),
(u'Employment', u'Tax', 1L),
(u'Employment', u'Debt', 1L),
(u'Employment', u'Budget', 1L),
(u'Environment', u'Business', 2L),
(u'Environment', u'Animal', 2L),
(u'Environment', u'Trees', 2L)]
您可以先对项目进行分组,然后从每组中分割前3个项目:
from itertools import groupby, islice
from operator import itemgetter
f = itemgetter(0)
r = [i for _, g in groupby(lst, f) for i in islice(g, 3)]
pprint(r)
对于一般情况,如果项目尚未排序(按类别和计数),则可以使用以下方法进行初始排序:
lst = sorted(lst, lambda x: (x[0], -x[2]))
这将根据类别和递减计数进行排序
您可以先对项目进行分组,然后从每组中分割前3个项目:
from itertools import groupby, islice
from operator import itemgetter
f = itemgetter(0)
r = [i for _, g in groupby(lst, f) for i in islice(g, 3)]
pprint(r)
对于一般情况,如果项目尚未排序(按类别和计数),则可以使用以下方法进行初始排序:
lst = sorted(lst, lambda x: (x[0], -x[2]))
这将根据类别和递减计数进行排序
这里您似乎需要的是groupby()
其中:
[[(u'Agriculture', u'Farming', 3L),
(u'Agriculture', u'Business', 2L),
(u'Agriculture', u'Animal', 2L)],
[(u'Employment', u'Money', 1L),
(u'Employment', u'Business', 1L),
(u'Employment', u'Tax', 1L)],
[(u'Environment', u'Business', 2L),
(u'Environment', u'Animal', 2L),
(u'Environment', u'Trees', 2L)]]
这里您似乎需要的是groupby()
其中:
[[(u'Agriculture', u'Farming', 3L),
(u'Agriculture', u'Business', 2L),
(u'Agriculture', u'Animal', 2L)],
[(u'Employment', u'Money', 1L),
(u'Employment', u'Business', 1L),
(u'Employment', u'Tax', 1L)],
[(u'Environment', u'Business', 2L),
(u'Environment', u'Animal', 2L),
(u'Environment', u'Trees', 2L)]]
您可以调整此项以导入islice
,并执行:[el代表k,g在groupby中(数据,lambda L:L[0]),el代表islice(g,3)]
,如果已经排序,则避免对分组值的依赖性可分片。@JonClements您摇滚!感谢您提供的提示,如果已经排序,您可以调整此选项以导入islice
,并执行:[el for k,g in groupby(data,lambda L:L[0])for el in islice(g,3)]
,避免对分组值的依赖性可切片。@JonClements您真是棒极了!谢谢你的提示