我目前正在复制与此问题类似的内容:python switch by class name?
我有一个for循环,它迭代一组对象,并按类型将它们分类到几个列表中。
for obj in list_of_things:
if isinstance(obj, Class1):
class1list.append(obj)
if isinstance(obj, Class2):
class2list.append(obj)
等。对于其他几个班级。应用程序类似于ORM - 每个类的数据将被提取并写入数据库,每个类都有不同的数据要提取。此外,在Class2的任何实例之前,必须由ORM处理Class1的所有实例。
最后,Class1和Class2不是我的 - 它们是我正在使用的API的输出,因此我无法像上一个问题中建议的那样更改它们(比如,编写serialize()方法转储每个类中我需要的数据)。我向API请求了一些对象,它让我充斥着各种类型的对象,我需要从中提取不同的数据。
有更多的pythonic方式吗?这种方法满足了需要,但它伤害了我的眼睛,我想学习更好的方法。我仍然是Python的新手。
答案 0 :(得分:0)
另一种方法,取决于您的具体情况,可能会利用type
类型是不可变的这一事实,因此可以用作字典键。
所以你可以这样做:
from collections import defaultdict
list_of_things = [2, 3, "Some", "String"]
obj_map = defaultdict(list)
for obj in list_of_things:
obj_map[type(obj)].append(obj)
print(obj_map)
输出:
defaultdict(<type 'list'>, {
<type 'int'>: [2, 3],
<type 'str'>: ['Some', 'String']
})
这里的想法是你不需要编写一大堆if isinstance
测试,你只需要“分组”每个对象的类型。
您可以使用类名作为键来访问字典的值:
print(obj_map[int]) # [2, 3]