如何根据属性对 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 列的不同值。

看起来您想以第二个索引处的项目作为键对列表进行排序。

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

你的术语令人困惑:你在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']]})

解释

  • 初始化列表的默认字典。
  • 循环访问列表列表。
  • 将项追加到由第三个元素确定的键。

然后可以通过以下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用于以有效的方式平展嵌套列表。

最新更新