我有一个对象列表,这些对象是我的代码中的特定类,如此,
[object1, object2, object3, object4, object5, object6]
Run Code Online (Sandbox Code Playgroud)
即该类有两个属性:class.score和class.id
我可能有相同ID的对象.例如.:
[object1.id, object2.id, object3.id, object4.id, object5.id, object6.id] = [1, 2, 3, 4, 2, 3]
Run Code Online (Sandbox Code Playgroud)
但得分不同.例如.:
[object1.score, object2.score, object3.score, object4.score, object5.score,
object6.score] = [0.25, 0.55, 0.6, 0.4, 0.30, .33]
Run Code Online (Sandbox Code Playgroud)
我想要做的是让列表没有这个对象的重复,但是添加了分数.所以对于前面的例子,输出将是:
[object1.id, object2.id, object3.id, object4.id] = [1, 2, 3, 4]
[object1.score, object2.score, object3.score, object4.score] = [.25, .85, .93, .4]
Run Code Online (Sandbox Code Playgroud)
我设法用两个for循环来做到这一点:
k = 1
for object in list_of_objects:
j = 1
for object2 in list_of_objects:
if object.id == object2.id and j > k:
object.score = object.score + object2.score
list_of_objects.remove(object2)
j += 1
k += 1
Run Code Online (Sandbox Code Playgroud)
但是我希望用更多的python-ish来做这件事:
newlist[:] = [ x for x in list_of_objects if certain_condition(x)]
Run Code Online (Sandbox Code Playgroud)
谢谢.
itertools.groupby完全符合这种情况
https://docs.python.org/2/library/itertools.html#itertools.groupby
from itertools import groupby
# object.id is our key:
keyfunc = lambda obj: obj.id
list_of_objects = sorted(list_of_objects, key=keyfunc)
scores = [sum(score_list) for id, score_list in groupby(list_of_objects, keyfunc)]
ids = [id for id, score_list in groupby(list_of_objects, keyfunc)]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
618 次 |
| 最近记录: |