如何根据列表中类的属性使Python中的列表与众不同?

2024-09-29 19:34:54 发布

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

我有一个来自同一个类的实例列表,并且我希望根据类中的属性使列表不同。实现这一目标的最具Python风格的方式是什么

以下是一些示例代码:

#!/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”属性区分列表?此外,如果这是可能的,那么基于列表中某个类的属性使列表变得不同是最“python”的方法吗

我已经尝试在SO和Google上搜索关于这个问题的主题,但我找到的所有结果都是简单的列表,只包含一个数值,而不是一个自定义对象


Tags: 方法lambdaself列表属性排序deftag
2条回答

您可以使用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]

假设要输入的属性是不可变的,则可以使用dict:

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

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

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

相关问题 更多 >

    热门问题