在迭代数据中的所有元素时,如何过滤大型数据集中适合特定键的记录

2024-06-28 11:13:19 发布

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

我有一个很大的数据集,我可以通过生成器/迭代器访问这些数据。在处理数据集时,我需要确定该数据集中是否有任何记录具有与正在处理的当前记录的属性值相同的属性。一种方法是使用嵌套的for循环。例如,如果要处理学生数据库,我可以做如下操作:

def fillStudentList():
    # TODO: Add some code here to  filll
    # a student list
    pass

students = fillStudentList()
sameLastNames = list()
for student1 in students1:
  students2 = fillStudentList()
  for student2 in students2:
    if student1.lastName == student2.lastName:
        sameLastNames.append((student1, student2))

如果上面的代码片段可以改进很多。代码片段的目标是显示嵌套for循环模式。在

现在假设我们有一个class Student,一个class Student(它是一个迭代器)和一个类源,它以一种内存高效的方式(比如另一个迭代器)提供对数据的访问。。。在

下面,我勾勒出这段代码可能是什么样子。有人对如何改进这一实施有什么想法吗?我们的目标是能够在具有相同属性的非常大的数据集中找到记录,这样就可以处理过滤后的数据集。在

^{pr2}$

Tags: 数据代码in目标for属性记录list
2条回答

也许这样的事情对你有用(这是O(n))

from collections import defaultdict
students = fillStudentList()
sameLastNames = defaultdict(list)
for student in students:
    sameLastNames[student.lastName].append(student)

sameLastNames = {k:v for k,v in sameLastNames.iteritems() if len(v)>1}

嵌套循环是O(n**2)。您可以改为使用sort和^{}来获得O(nlogn)性能:

students = fill_student_list()
same_last_names = [list(group) for lastname, group in 
                   groupby(sorted(students, key=operator.attrgetter('lastname'))]

一般来说,您似乎在尝试做数据库支持的ORM所做的事情。不要自己动手,而是使用已经存在的众多ORMs之一。有关列表,请参见What are some good Python ORM solutions?。它们将比你自己编写的代码更加优化和强大。在

相关问题 更多 >