1

我有两个多对多模型,组和个人。

我可以访问 group.individuals 并获取相关个人的列表。我在组模型上有一个“last_individual_id”列,以跟踪上次使用的个人。有了这些信息,我正在徘徊如何为一个小组找到下一个个人。

我想为个人获取 id 并使用 itertools.cycle 但我无法指定起点。另外,如果我可以在 SQLAlchemy 中正确地做到这一点,这可能是一种缓慢的方法。

关于如何做到这一点的任何想法?我觉得我会因为答案如此简单而感到尴尬......但我今天没有咖啡因!

谢谢

4

1 回答 1

0

一种可能性是使用 itertools.dropwhile (但这可能会限制为您所需解决方案的范围,因为尚不清楚,而且 itertools.dropwhile 不会像 itertools.cycle 那样无限循环遍历您的列表)。

您没有提供数据模型的很多细节。我假设 group.individuals 返回一个个人对象列表,并且 '.id' 属性代表每个人的 ID 号。例如,假设您在 group.individuals 列表中寻找个人 id 7:

from itertools import dropwhile
for item in dropwhile(lambda x: x.id != 7, group.individuals):
    print item

这将遍历列表,直到找到 id=7(或更准确地说,直到 x.id != 7,因为 itertools.dropwhile 在第一次 False 测试之前不会返回任何内容),然后它将开始从列表。因此,如果该列表中的 id 类似于:[1, 19, 5, 6, 7, 2, 4, 5] 这将返回:7 2 4 5。

出于您的目的,听起来您会忽略第一个返回的响应,然后再使用响应。

另一种选择是遍历您的原始 group.individuals 列表以找到您想要的 id 的索引,然后只增加索引 - 如果您计算的索引超出您的列表,这也将允许您从 0 开始索引,对于例子:

def nextrecord(recordlist, value):    
    for i in range(len(recordlist)):        
        if recordlist[i].id == value:
            newindex = i + 1
            break
    if newindex >= len(recordlist):
        newindex = 0    
    return recordlist[newindex]

print nextrecord(group.individuals, 7)

但是,当然,这更加离散,并且不可迭代。可能有很多其他方法可以解决这个问题(包括使我的函数可迭代),但我还没有喝咖啡因!

于 2011-05-04T13:56:28.473 回答