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

2024-09-28 19:35:37 发布

您现在位置: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'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

Tags: ifenvironmentcounterresbusiness类别last元组
3条回答

您可以使用列表来完成:

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

你似乎需要的是groupby()。你知道吗

from itertools import groupby
import pprint

l = [(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)]

pprint.pprint([sorted(x[1], key=(lambda x: -1*x[2]))[:3] 
               for x in groupby(l, lambda x: x[0])])

它给出:

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

您可以先对项目进行分组,然后对每组的前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]))

这将对类别和递减计数进行排序。你知道吗


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

相关问题 更多 >