使用循环和if条件从另一个二维列表创建二维列表

2024-06-28 11:08:59 发布

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

您好,我是python新手,我的想法像c#一样,我不能做一些事情。 我有这个清单给我的前任

    data = [["Bob","Algebra",5],["Bob","History",4],["Bob","Physics",7],["Bob","Astronomy",5],["Allen","Algebra",5],["Allen","History",4],["Allen","Physics",7],["Mary","Algebra",5],["Mary","History",3],["Mary","Physics",7],["Mary","Astronomy",8]
]

我是如何从中输出的:

MathsPerStudent = [["Bob","Algebra","History","Physics","Astronomy"]
                   ["Allen","Algebra","History","Physics"]
                   ["Mary","Algebra","History","Physics","Astronomy"]]

依我看,我不可能

MathsPerStudents=[[]]
        for i in data:
           for j in MathsPerStudents:
               if data[i][0] == j[0]
               MathsPerStudents.append(j[0][i])

并用某种方法来正确填写数学学生。正如我所见,数据[i]无法与j[i]进行比较,因为一个是list,另一个是int from元素。问题是我如何在类似数据列表的列表中使用(i)作为索引


Tags: 数据in列表fordata事情historybob
3条回答

如果列表按名称排序,则可以使用itertools.groupby

import itertools

data = [["Bob","Algebra",5],["Bob","History",4],["Bob","Physics",7],["Bob","Astronomy",5],["Allen","Algebra",5],["Allen","History",4],["Allen","Physics",7],["Mary","Algebra",5],["Mary","History",3],["Mary","Physics",7],["Mary","Astronomy",8]]

output = []
for student, classes in itertools.groupby(data, key=lambda x: x[0]):
    output.append([student] + [entry[1] for entry in classes])
print(output)

您可以这样做(不是一行,但可能更容易理解):

MathsPerStudent = {}
for name, subject, grade in data:
    if name not in MathsPerStudent:
        MathsPerStudent[name] = []
    MathsPerStudent[name].append(subject)

这将为您提供一本字典:

>>> from pprint import pprint
>>> pprint(MathsPerStudent)
{'Allen': ['Algebra', 'History', 'Physics'],
 'Bob': ['Algebra', 'History', 'Physics', 'Astronomy'],
 'Mary': ['Algebra', 'History', 'Physics', 'Astronomy']}

如果您愿意,您可以将其转换为列表形式,但对于您试图实现的目标,词典可能更易于使用:

MathsPerStudentList = [[name] + subjects for name, subjects in MathsPerStudent.items()]

最后的清单如下:

>>> pprint(MathsPerStudentList)                                                                                                                            
[['Bob', 'Algebra', 'History', 'Physics', 'Astronomy'],                                                                                                    
 ['Allen', 'Algebra', 'History', 'Physics'],                                                                                                               
 ['Mary', 'Algebra', 'History', 'Physics', 'Astronomy']]

使用setdefault

Ex:

data = [["Bob","Algebra",5],["Bob","History",4],["Bob","Physics",7],["Bob","Astronomy",5],["Allen","Algebra",5],["Allen","History",4],["Allen","Physics",7],["Mary","Algebra",5],["Mary","History",3],["Mary","Physics",7],["Mary","Astronomy",8]]
result = {}
for k, sub, _ in data:
    result.setdefault(k, []).append(sub)    #Set first element as key and append subject as value
print([[k] + v for k, v in result.items()])   #Form required list

输出:

[['Bob', 'Algebra', 'History', 'Physics', 'Astronomy'],
 ['Allen', 'Algebra', 'History', 'Physics'],
 ['Mary', 'Algebra', 'History', 'Physics', 'Astronomy']]

相关问题 更多 >