根据属性均匀分布对象

时间:2017-03-04 17:36:24

标签: python python-2.7 list web-scraping

我正在寻找一种如何根据列表的属性均匀分布对象的方法。

例如:

[{'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,因此我想均匀地分发它们,因为我不想让某些服务器超载。

你知道如何解决这个问题吗?或者是否有一些模块可以做到这一点?

1 个答案:

答案 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}
>>>