我有一个具有suit
属性的对象数组,并且我想根据对象适合的对象拆分为子数组。我目前正在使用此:
for c in cards:
if c.suit.value == 0:
spades.append(c)
elif c.suit.value == 1:
diamonds.append(c)
elif c.suit.value == 2:
clubs.append(c)
else:
hearts.append(c)
我尝试使用itertools.groupby
如下:
suits = [list(g) for g in intertools.groupby(cards, lambda x: x.suit.value)]
但这只会产生:
[[3, <itertools._grouper object at 0x000000000296B2E8>], ...]
我的第一种方法有效,我只是想象有一个简单的pythonic衬垫可以满足我的需求。
尽管它不是单线的,但是通过使用列表,我们使它更加优雅:
spades, diamonds, clubs, hearts = collcard = [[] for _ in range(4)]
for c in cards:
collcard[c.suit.value].append(c)
因此,这里我们用四个空子列表初始化一个列表,然后将卡添加c
到带有index的列表中c.suit.value
。
我们使用迭代拆包将第一个元素分配给spades
,将第二个元素分配给diamonds
,等等。
好处是我们避免排序(在O(n log n)中有效)。因此,该算法具有时间复杂度O(n)(假定列表追加的摊销成本为O(1))。
尽管“单行”通常很优雅,但是编写“单行”时不应该花太多力气,因为“单行”可能会更难理解,或者对性能产生重大影响。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句