创建一个列表理解,将列表中的某些值重复 X 次,然后移至下一项

Car*_*_OL 5 python list-comprehension

我有一个非常具体的用例来创建列表理解,但我在弄清楚如何去做时遇到了一些麻烦。我确信一定有一种方法或函数可以帮助我,但我想我不知道。

场景如下:以下代码按预期工作并生成所有预期的变化(总共 8 个)

List_A = ["apples","oranges"]
List_B = ["meat","chicken"]
flexibility = range(2)

list = []
for a in List_A:
    results = [(day, b, a) for day in flexibility for b in List_B]
    list.append(results)
print (list)
Run Code Online (Sandbox Code Playgroud)

结果

[[(0, 'meat', 'apples'), (0, 'chicken', 'apples'), (1, 'meat', 'apples'), (1, 'chicken', 'apples')], 
 [(0, 'meat', 'oranges'), (0, 'chicken', 'oranges'), (1, 'meat', 'oranges'), (1, 'chicken', 'oranges')]]
Run Code Online (Sandbox Code Playgroud)

问题就在这里。假设我的速率限制为每秒 5 次调用,并且上面的列表创建了 8 个元素,因此我会超出速率限制。我认为可以克服这个问题的方法是创建另一个变量来传递给函数,该函数将使用不同的帐户来发出我的 api 请求。理论上,每个帐户只会发出 5 个请求。因此,在上面的示例中,列表的前 5 个元素将使用帐户 0,其余 3 个元素将使用帐户 1。我尝试使用列表理解来实现此目的,但结果不是我所期望的:

no = [0,1,2]
List_A = ["apples","oranges"]
List_B = ["meat","chicken"]
flexibility = range(2)

list = []
for a in List_A:
    results = [(day, b, a,n) for day in flexibility for b in List_B for n in no]
    list.append(results)
print (list)
Run Code Online (Sandbox Code Playgroud)

结果

[[(0, 'meat', 'apples', 0), (0, 'meat', 'apples', 1), (0, 'meat', 'apples', 2), (0, 'chicken', 'apples', 0), (0, 'chicken', 'apples', 1), (0, 'chicken', 'apples', 2), (1, 'meat', 'apples', 0), (1, 'meat', 'apples', 1), (1, 'meat', 'apples', 2), (1, 'chicken', 'apples', 0), (1, 'chicken', 'apples', 1), (1, 'chicken', 'apples', 2)], 
 [(0, 'meat', 'oranges', 0), (0, 'meat', 'oranges', 1), (0, 'meat', 'oranges', 2), (0, 'chicken', 'oranges', 0), (0, 'chicken', 'oranges', 1), (0, 'chicken', 'oranges', 2), (1, 'meat', 'oranges', 0), (1, 'meat', 'oranges', 1), (1, 'meat', 'oranges', 2), (1, 'chicken', 'oranges', 0), (1, 'chicken', 'oranges', 1), (1, 'chicken', 'oranges', 2)]]
Run Code Online (Sandbox Code Playgroud)

我的列表中的元素比我想要的多得多。我仍然想要原来的 8 个,但前 5 个将使用帐户 0,最后 3 个将使用帐户 1。

目标是获得此列表:

[(0, 'apples', 'meat',0), 
 (0, 'apples', 'chicken',0), 
 (0, 'oranges', 'meat',0), 
 (0, 'oranges', 'chicken',0), 
 (1, 'apples', 'meat',0), 
 (1, 'apples', 'chicken',1), 
 (1, 'oranges', 'meat',1), 
 (1, 'oranges', 'chicken',1)]
Run Code Online (Sandbox Code Playgroud)

我怎样才能实现这个目标?谢谢

slo*_*rop 5

执行此操作的一种简洁方法是结合itertools.product给出组合,并enumerate为您提供运行计数器。您可以将该计数器除以 5,得到您的“帐号”:

import itertools

List_A = ["apples", "oranges"]
List_B = ["meat", "chicken"]
flexibility = range(2)
rate_limit = 5

res = [(n, a, b, i // rate_limit)
       for i, (n, a, b) in enumerate(itertools.product(flexibility, List_A, List_B))]
print(res)
Run Code Online (Sandbox Code Playgroud)

它给出了您正在寻找的输出列表:

[(0, 'apples', 'meat', 0), (0, 'apples', 'chicken', 0), (0, 'oranges', 'meat', 0), (0, 'oranges', 'chicken', 0), (1, 'apples', 'meat', 0), (1, 'apples', 'chicken', 1), (1, 'oranges', 'meat', 1), (1, 'oranges', 'chicken', 1)]
Run Code Online (Sandbox Code Playgroud)