我有一个来自同一个类的实例列表,我想根据类中的属性使我的列表不同。实现这一目标的最pythonic方式是什么?
以下是一些示例代码:
#!/usr/bin/python
#-*- coding:utf-8 -*-
class MyClass(object):
def __init__(self, classId, tag):
self.classId = classId
self.tag = tag
myList = []
myInstance1 = MyClass(1, "ABC")
myInstance2 = MyClass(2, "DEF")
myInstance3 = MyClass(3, "DEF")
myList.append(myInstance1)
myList.append(myInstance3) # note that the order is changed deliberately
myList.append(myInstance2)
如果我现在要根据MyClass中的一个属性对列表进行排序,我通常只需按键对其进行排序,并使用lambda表达式设置密钥 - 如下所示:
myList.sort(key=lambda x: x.classId)
for x in myList:
print x.classId
$ python ./test.py
1
2
3
是否可以使用类似的方法(lambda,map或类似方法)根据“tag”属性使列表不同?另外,如果这是可能的,那么根据该列表中某个类的属性制作列表的最“pythonic”方法是什么?
我已经尝试在SO和Google上搜索有关此问题的主题,但我发现的所有结果都只处理了包含数值但不包含自定义对象的简单列表。
答案 0 :(得分:12)
您可以使用python dict comprehension
{x.tag: x for x in myList}.values()
对于你的例子:
>>> class MyClass(object):
... def __init__(self, classId, tag):
... self.classId = classId
... self.tag = tag
...
>>> myList = [MyClass(1, "ABC"), MyClass(2, "DEF"), MyClass(3, "DEF")]
>>> uniqList = {x.tag: x for x in myList}.values()
>>> print [x.classId for x in uniqList]
[1, 3]
答案 1 :(得分:6)
假设您想要键入的属性是不可变的,您可以使用dict:
d = {}
for x in xs:
d[x.tag] = x
现在d
每个x
值包含一个tag
;您可以使用d.values()
或d.itervalues()
来xs
。
NB。这里最后匹配的项目获胜;让第一个获胜,反过来。