gpt4 book ai didi

python - 从列表中查找属性等于某个值的对象,并在之后获取下一个对象

转载 作者:太空宇宙 更新时间:2023-11-04 10:26:39 26 4
gpt4 key购买 nike

我能够找到一个其属性等于某个值的对象。但我还想从列表中获取该对象之后的对象(如果找到的对象是列表中的最后一个对象,则该对象之后的下一个对象应该是第一个对象)。像这样的东西:

from pprint import pprint

class User(object):
def __init__(self, name):
self.name = name

users = []
users.append(User("Peter"))
users.append(User("James"))
users.append(User("John"))

# find object that has attribute name equal to James
pprint(vars([user for user in users if user.name == "James"][0]))

并且 pprint 行的输出打印:

{'name': 'James'}

没错。

我想问你如何获取 "James" 之后的下一个对象,以及我是否要搜索 "John" 之后的下一个对象“John” 应该返回 “Peter”。有什么建议吗?

我也试过 itertools,但如果找到的元素是最后一个,我就无法获取下一个元素:

from itertools import enumerate
_i = next(i for i, user in enumerate(users) if (user.name == "John"))
print users[_i + 1] #this is not working

我可以在操作 [_i+1] 之前添加 if 条件来更改计数器,但我想知道是否有更流畅的解决方案?

最佳答案

要处理最后一个元素,您可以使用模数:index % len(users)

这是一种方法:

def find_after_name(users, name):
for i, user in enumerate(users):
if user.name == name:
return users[(i+1) % len(users)]

另一种选择是使用列表的移动副本zip 列表。 deque.rotate() 对这种移位很有用:

from collections import deque
def find_after_name(users, name):
users2 = deque(users)
users2.rotate(-1)
for user1, user2 in zip(users1, users2):
if user1.name == name:
return user2

关于python - 从列表中查找属性等于某个值的对象,并在之后获取下一个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28997563/

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