如何按值对列表进行分组?

2024-09-30 01:34:18 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有这样一个列表:

[['John', 1], ['Fred', 1], ['Carolyn', 1], ['Kenneth', 3], ['Ronald', 3], ['Dorothy', 2], ['Joyce', 2], ['Julia', 3], ['Deborah', 1], ['Jonathan', 2], ['Aaron', 2], ['Marie', 1], ['Adam', 2], ['Kevin', 2], ['Alice', 2], ['Jerry', 1], ['Kimberly', 1], ['Lawrence', 1], ['Louis', 2], ['Anthony', 1], ['Carolyn', 3], ['Edward', 2], ['Samuel', 3], ['Rachel', 1], ['Kathleen', 1], ['Fred', 3], ['Fred', 3], ['Gerald', 2], ['Donna', 2], ['Keith', 3], ['Matthew', 3], ['Stephanie', 1]]

如何获得此输出:

John Dorothy Kenneth
Fred Joyce Ronald
Carolyn Jonathan Julia
Deborah Aaron Carolyn
Marie Adam Samuel
Jerry Kevin Fred
Kimberly Alice Fred
Lawrence Louis Keith
Anthony Edward Matthew

我要做的是把三个元素分组。如果一个组不是由3个名称组成的,则不会显示该组。你知道吗

另一个例子:

输入:

[['Heather', 2], ['Evelyn', 1], ['Norma', 1], ['Evelyn', 3], ['Harry', 3], ['Sean', 1], ['Anna', 1], ['Jerry', 3], ['Anna', 3], ['Julia', 1], ['Dorothy', 2]]

预期产量:

Evelyn Heather Evelyn
Norma Dorothy Harry

到目前为止,我只根据每个数字(1、2、3)将他们的名字分组到子列表中。你知道吗

r = [[] for i in range(3)]
for i in l:
    if i[1] == 1:
        r[0].append(i[0])
    elif i[1] == 2:
        r[1].append(i[0])
    elif i[1] == 3:
        r[2].append(i[0])
print r

r = [['John', 'Fred', 'Carolyn', 'Deborah', 'Marie', 'Jerry', 'Kimberly', 'Lawrence', 'Anthony', 'Rachel', 'Kathleen', 'Stephanie'], ['Dorothy', 'Joyce', 'Jonathan', 'Aaron', 'Adam', 'Kevin', 'Alice', 'Louis', 'Edward', 'Gerald', 'Donna'], ['Kenneth', 'Ronald', 'Julia', 'Carolyn', 'Samuel', 'Fred', 'Fred', 'Keith', 'Matthew']]

Tags: fredjohnaaronjuliaadamjonathanjerrykenneth
3条回答

下面是一个类似于this问题的方法:

l1 = [['John', 1], ['Fred', 1], ['Carolyn', 1], ['Kenneth', 3], ['Ronald', 3], ['Dorothy', 2], ['Joyce', 2], ['Julia', 3], ['Deborah', 1], ['Jonathan', 2], ['Aaron', 2], ['Marie', 1], ['Adam', 2], ['Kevin', 2], ['Alice', 2], ['Jerry', 1], ['Kimberly', 1], ['Lawrence', 1], ['Louis', 2], ['Anthony', 1], ['Carolyn', 3], ['Edward', 2], ['Samuel', 3], ['Rachel', 1], ['Kathleen', 1], ['Fred', 3], ['Fred', 3], ['Gerald', 2], ['Donna', 2], ['Keith', 3], ['Matthew', 3], ['Stephanie', 1]]
l2 = [['Heather', 2], ['Evelyn', 1], ['Norma', 1], ['Evelyn', 3], ['Harry', 3], ['Sean', 1], ['Anna', 1], ['Jerry', 3], ['Anna', 3], ['Julia', 1], ['Dorothy', 2]]

def get_exp(l):
    v = set(map(lambda x:x[1], l))
    nl = [[y[0] for y in l if y[1]==x] for x in v]
    return '\n'.join(list(map(' '.join, zip(*nl))))
output_l1 = get_exp(l1)
output_l2 = get_exp(l2)

输出\u l1

John Dorothy Kenneth
Fred Joyce Ronald
Carolyn Jonathan Julia
Deborah Aaron Carolyn
Marie Adam Samuel
Jerry Kevin Fred
Kimberly Alice Fred
Lawrence Louis Keith
Anthony Edward Matthew

输出l2:

Evelyn Heather Evelyn
Norma Dorothy Harry

怎么样:

l = [['Heather', 2], ['Evelyn', 1], ['Norma', 1], ['Evelyn', 3], ['Harry', 3], ['Sean', 1], ['Anna', 1], ['Jerry', 3], ['Anna', 3], ['Julia', 1], ['Dorothy', 2]]
from itertools import groupby
def keyfunc(arr) :
   return arr[1]

l = sorted(l, key=keyfunc)
s =[[*x,] for  i,x in groupby(data , keyfunc)]
combinations = [*zip(*s),]

然后你就可以通过以下操作打印出元素:

for l in combinations :
   print(' '.join([x[0] for x in l]))

打印输出:

John Dorothy Kenneth
Fred Joyce Ronald
Carolyn Jonathan Julia
Deborah Aaron Carolyn
Marie Adam Samuel
Jerry Kevin Fred
Kimberly Alice Fred
Lawrence Louis Keith
Anthony Edward Matthew

您可以使用zipitertools.groupby的组合非常简洁地实现这一点。首先,按数字对列表排序,然后分组和压缩。如果需要字符串,则可以加入:

from operator import itemgetter
from itertools import groupby

l = [['John', 1], ['Fred', 1], ['Carolyn', 1], ['Kenneth', 3], ['Ronald', 3], ['Dorothy', 2], ['Joyce', 2], ['Julia', 3], ['Deborah', 1], ['Jonathan', 2], ['Aaron', 2], ['Marie', 1], ['Adam', 2], ['Kevin', 2], ['Alice', 2], ['Jerry', 1], ['Kimberly', 1], ['Lawrence', 1], ['Louis', 2], ['Anthony', 1], ['Carolyn', 3], ['Edward', 2], ['Samuel', 3], ['Rachel', 1], ['Kathleen', 1], ['Fred', 3], ['Fred', 3], ['Gerald', 2], ['Donna', 2], ['Keith', 3], ['Matthew', 3], ['Stephanie', 1]]

l.sort(key = itemgetter(1))
groups = zip(*([name for name, g in n] for k, n in groupby(l, itemgetter(1))))

[" ".join(names) for names in groups]

输出:

['John Dorothy Kenneth',
 'Fred Joyce Ronald',
 'Carolyn Jonathan Julia',
 'Deborah Aaron Carolyn',
 'Marie Adam Samuel',
 'Jerry Kevin Fred',
 'Kimberly Alice Fred',
 'Lawrence Louis Keith',
 'Anthony Edward Matthew']

相关问题 更多 >

    热门问题