我正在编写一些python脚本来生成JSON。我成功构建了jSON。但在循环顺序中选择数字的过程中陷入了困境。 让我们说,我有一个1,2,3,4,5的列表。我需要在这里选择前4个数字(1,2,3,4)作为第一项,选择2,3,4,5作为第二项,选择3,4,5,1作为第三项,应该持续到30次。你知道吗
import json
import random
json_dict = {}
number = []
brokers = [1,2,3,4,5]
json_dict["version"] = version
json_dict["partitions"] = [{"topic": "topic1", "name": i,"replicas":
random.choice(brokers)} for i in range(0, 30)]
with open("output.json", "w") as outfile:
json.dump(json_dict, outfile, indent=4)
输出
"version": "1",
"partitions": [
{
"topic": "topic1",
"name": 0,
"replicas": 1,2,3,4
},
{
"topic": "topic1",
"name": 1,
"replicas": 2,3,4,5
},
{
"topic": "topic1",
"name": 3,
"replicas": 3,4,5,1
不管怎样,我怎样才能做到这一点?你知道吗
为了从
brokers list
中获得循环元素,您可以使用collections
模块中的deque
并执行deque.rotation(-1)
如下示例:输出:
此外,这也是如何将此解决方案实施到最终dict的一种方法:
输出:
这是一个纯粹的程序性解决方案,它还增加了选择任意数量、任意规模(甚至比原来的“经纪人”名单还要大)的组的灵活性,并提供了任何补偿:
它用一个循环在一个O(N)时间内完成。你知道吗
如果您计划在一个非常大的生成器上运行这个函数,您可以通过放弃
result
集合并执行yield group
而不是result.append(group)
来将get_subgroups()
函数转换为生成器。这样,您就可以在循环中调用它:for group in get_subgroups(30, broker, 4):
,并将group
存储在您想要的任何结构中。你知道吗更新
如果内存不是一个问题,我们可以通过扩展整个
base
(或者在您的情况下是brokers
)以适应整个集合来进一步优化(处理方面):或者,如果我们不需要将列表转换为生成器的能力,我们可以通过列表理解使其更快:
这是一个很酷的问题,我想我有一个很酷的解决方案:
这给了
它所做的是将你的一组东西附加到它本身(
items * 2
->;[1, 2, 3, 4, 5, 1, 2, 3 ,4, 5]
),然后选择一个开始的地方(x
),通过循环迭代(i
)并根据我们拥有的项数(i in [x % len(items)]
)调整它(可能不是正确的词)。你知道吗相关问题 更多 >
编程相关推荐