Python 从元组列表中获取前3个元素

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

下面是由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'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您真是棒极了!谢谢你的提示