如何在python中基于属性对二维列表进行分组?

2024-09-29 21:42:35 发布

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

示例: 以下是我的2D列表:

a=[]
a.append(['abc.com','ars','league1','man'])
a.append(['abcxyz.com','hah','league2','bah'])
a.append(['abcd.com','gah','league3','fah'])
a.append(['abcm.com','ada','league1','ads'])
a.append(['abcxyzf.com','gha','league1','tra'])
a.append(['abcdg.com','jhi','league2','yui'])

我希望我的输出是:

print(a)
Output:
['abc.com','ars','league1','man']
['abcm.com','ada','league1','ads']
['abcxyzf.com','gha','league1','tra']
['abcxyz.com','hah','league2','bah']
['abcdg.com','jhi','league2','yui']
['abcd.com','gah','league3','fah']

也就是说,我想根据索引2中的属性对列表进行分组。你知道吗

至少,我需要第3列的不同值。你知道吗


Tags: com列表abcabcdappendmanarsbah
2条回答

你的术语令人困惑:你在a中拥有的是一个列表而不是一个元组列表。但是,这与下面提供的解决方案无关。你知道吗

另外,请注意这里不涉及属性。我们访问列表元素。你知道吗

处理问题(分组键和唯一键)的经典Python方法是使用collections.defaultdict

设置

a = []
a.append(['data1','data2','data3','data4'])
a.append(['data21','data22','data3','data24'])
a.append(['data31','data32','data4','data34'])

解决方案

from collections import defaultdict

d = defaultdict(list)

for item in a:
    d[item[2]].append(item)

结果

defaultdict(list,
            {'data3': [['data1', 'data2', 'data3', 'data4'],
                       ['data21', 'data22', 'data3', 'data24']],
             'data4': [['data31', 'data32', 'data4', 'data34']]})

解释

  • 初始化列表的默认词典。你知道吗
  • 迭代列表。你知道吗
  • 将项附加到由第3个元素确定的键。你知道吗

您的排序列表格式可以通过sorted

from operator import itemgetter
from itertools import chain

sorter = map(itemgetter(1), sorted(d.items()))
res = list(chain.from_iterable(sorter)))

[['data1', 'data2', 'data3', 'data4'],
 ['data21', 'data22', 'data3', 'data24'],
 ['data31', 'data32', 'data4', 'data34']]

sorter对字典中的项进行排序,就像它们是键值元组一样(因此,由于键是唯一的,所以按键排序)。itemgetter(1)提取结果的第二个元素,即值。你知道吗

chain.from_iterable用于有效地展平嵌套列表。你知道吗

看起来您希望以第二个索引处的项作为键对列表进行排序。你知道吗

a=[]
a.append(['abc.com','ars','league1','man'])
a.append(['abcxyz.com','hah','league2','bah'])
a.append(['abcd.com','gah','league3','fah'])
a.append(['abcm.com','ada','league1','ads'])
a.append(['abcxyzf.com','gha','league1','tra'])
a.append(['abcdg.com','jhi','league2','yui'])

a.sort(key=lambda k: k[2])
print(a)

输出:

[['abc.com', 'ars', 'league1', 'man'],
 ['abcm.com', 'ada', 'league1', 'ads'],
 ['abcxyzf.com', 'gha', 'league1', 'tra'],
 ['abcxyz.com', 'hah', 'league2', 'bah'],
 ['abcdg.com', 'jhi', 'league2', 'yui'],
 ['abcd.com', 'gah', 'league3', 'fah']]

相关问题 更多 >

    热门问题