gpt4 book ai didi

python - 按对象属性访问 Python 对象列表

转载 作者:太空狗 更新时间:2023-10-30 03:00:37 28 4
gpt4 key购买 nike

我不知道我正在尝试做的事情是否太不符合 Pythonic 以至于我只是想做错了,或者我是否不知道如何正确地提出问题。能够做到这一点对我来说很有意义,但我已经搜索了 15 种不同的方法,但找不到答案。

我想做的事情看起来很简单:我有一个对象列表。我想通过对象的属性访问该列表。此代码有效:

class Fruit:
def __init__(self, name, color):
self.name = name
self.color = color

def __str__(self):
return self.name

class BaseballPlayer:
def __init__(self, name, number, position):
self.name = name
self.number = number
self.position = position

def __str__(self):
return self.name

class ListByProperty(list):
def __init__(self, property, list):
super(ListByProperty, self).__init__(list)
self.property = property

def __getitem__(self, key):
return [item for item in self if getattr(item, self.property) == key][0]

fruits = ListByProperty('name', [Fruit('apple', 'red'), Fruit('banana', 'yellow')])

baseballTeam = ListByProperty('position', [BaseballPlayer('Greg Maddux', 31, 'P'),
BaseballPlayer('Javy Lopez', 8, 'C')])
teamByNumber = ListByProperty('number', baseballTeam)

print 'Apples are', fruits['apple'].color

pitcher = baseballTeam['P']
print 'The pitcher is #%s, %s' % (pitcher.number, pitcher)
print '#8 is', teamByNumber[8]

>>> Apples are red
The pitcher is #31, Greg Maddux
#8 is Javy Lopez

但是我真的必须创建自己的列表类才能做这么简单的事情吗?除了循环或 listcomp 之外没有通用的方法吗?这似乎应该是一件很常见的事情,拥有一个对象列表并通过对象的属性访问列表中的项目。它似乎应该以类似于 sorted(key=...) 的方式得到普遍支持。

请注意,这与需要字典不同。事实上,使用对象列表而不是 dict 的全部意义在于避免必须执行以下操作:

fruits = {'apple': Fruit('apple', 'red')}

...这需要您输入 apple 两次。似乎应该有一种通用的方法来做这样的事情:

print 'Apples are', fruits['apple'].color

...无需继承 list

好吧,你可以像这样构建一个字典:

fruits = [Fruit('apple', 'red'), Fruit('banana', 'yellow')]
fruits = {f.name: f for f in fruits}

或者您可以将它单行化,但这似乎仍然……呃……语法上很糟糕? :)

目前我想到的最好的方法是:

class DictByProperty(dict):
def __init__(self, property, list):
super(DictByProperty, self).__init__({getattr(i, property): i for i in list})
self.property = property

fruits = DictByProperty('name', [Fruit('apple', 'red')])

哦,谢谢,我已经从这个问题中学到了很多东西。

最佳答案

class Fruit:
def __init__(self, name, color):
self.name = name
self.color = color

fruits = dict(zip(['apple', 'banana'], [Fruit('apple', 'red'), Fruit('banana', 'yellow')]))

print("An apple is %s" % fruits['apple'].color)

或者:

fruits = {fruit.name : fruit for fruit in [Fruit('apple', 'red'), Fruit('banana', 'yellow')]}

print("An apple is %s" % fruits['apple'].color)

以下确实产生了一个集合:

fruits = {Fruit('apple', 'red'), Fruit('banana', 'yellow')}

注意与我创建字典的方式的不同

fruits = [Fruit('apple', 'red'), Fruit('banana', 'yellow')]

print("An apple is %s" % fruits[fruits.index('apple')].color)

不起作用,因为您的列表包含水果类型的对象而不是字符串,这里也是同样的情况:

fruits = FruitList([Fruit('apple', 'red'), Fruit('banana', 'yellow')])

print("An apple is %s" % fruits['apple'].color)

要使上述方法有效,请执行以下操作:

class Fruit:
def __init__(self, name, color):
self.name = name
self.color = color

def __eq__(self, other):
if isinstance(other, Fruit):
return (self.name, self.color) == (other.name, other.color)
return self.name == other

fruits = [Fruit('apple', 'red'), Fruit('banana', 'yellow')]
print("An apple is %s" % fruits[fruits.index('apple')].color)

我不推荐这样做,因为如果您的列表恰好包含字符串 apple,那么对 color 的属性调用将变得无效,因为字符串没有名为 color

的属性

关于python - 按对象属性访问 Python 对象列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28620389/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com