我正在寻找一种如何根据列表的属性均匀分布对象的方法。
例如:
[{'fruit':'apple', 'price':45},{'fruit':'apple', 'price':5},
{'fruit':'orange','price':4},{'fruit':'orange','price':45},
{'fruit':'orange','price':8},{'fruit':'orange','price':450},]
我想重新排序这个列表,尽可能地分开同类的所有水果。这个简单例子的解决方案是:
[{'fruit':'orange', 'price':45},{'fruit':'apple', 'price':5},
{'fruit':'orange','price':4},{'fruit':'apple','price':45},
{'fruit':'orange','price':8},{'fruit':'orange','price':450},]
所以orange,apple,orange,orange,apple,orange
是正确的解决方案之一。
这是一个简化的例子。事实上,它是关于刮取大量的网址。我用100名工人的池子刮了那些网址。可以有多个具有相同站点的URL,因此我想均匀地分发它们,因为我不想让某些服务器超载。
你知道如何解决这个问题吗?或者是否有一些模块可以做到这一点?
答案 0 :(得分:1)
roundrobin
itertools recipe与itertools.groupby结合使用
from itertools import cycle, groupby, islice
def roundrobin(*iterables):
"roundrobin('ABC', 'D', 'EF') --> A D E B F C"
# Recipe credited to George Sakkis
pending = len(iterables)
nexts = cycle(iter(it).__next__ for it in iterables)
while pending:
try:
for next in nexts:
yield next()
except StopIteration:
pending -= 1
nexts = cycle(islice(nexts, pending))
earls = [{'fruit':'apple', 'price':45},{'fruit':'apple', 'price':5},
{'fruit':'orange','price':4},{'fruit':'orange','price':45},
{'fruit':'orange','price':8},{'fruit':'orange','price':450},]
key = operator.itemgetter('fruit')
earls.sort(key = key)
groups = (tuple(group) for key, group in groupby(earls, key))
for thing in roundrobin(*groups):
print(thing)
结果:
{'fruit': 'apple', 'price': 45}
{'fruit': 'orange', 'price': 4}
{'fruit': 'apple', 'price': 5}
{'fruit': 'orange', 'price': 45}
{'fruit': 'orange', 'price': 8}
{'fruit': 'orange', 'price': 450}
>>>