9

我有一个来自同一类的实例列表,我想根据类中的属性使我的列表与众不同。实现这一目标的最蟒蛇方式是什么?

这是一些示例代码:

#!/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 上搜索有关此问题的主题,但我发现的所有结果都处理仅包含数值而不包含自定义对象的简单列表。

4

2 回答 2

19

你可以使用python dict理解

{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]
于 2014-11-04T10:06:18.727 回答
6

假设您希望键入的属性是不可变的,您可以使用 dict:

d = {}
for x in xs:
    d[x.tag] = x

现在d将包含单个x每个tag值;您可以使用d.values()d.itervalues()来获取xs.

注意。这里最后一个匹配的项目获胜;要获得第一个胜利,请反向迭代。

于 2013-06-03T14:26:06.870 回答