如何通过组合元组和静态字符串使用 itertools 创建字典
How to create a dictionary with itertools by combining a tuple and static string
目前我有一个生成的迭代器:
(0, 10), (10, 20), (20, 30), (30, 40), (40, 50), (50, 56), (56, None)
我想要制作的东西:
[["current": "0", "next":"10", "default": "value"], ["current": "10", "next":"20", "default": "value"]],
我目前拥有的:
('default', (0, 10)), ('default', (10, 20)), ('default', (20, 30)), ('default', (30, 40)), ('default', (40, 50)), ('default', (50, 56)), ('default', (56, None))
我可以做哪些更改来从我的元组列表中生成字典?
这是重现我所拥有内容的代码:
start = 0
end = 56
step = 10
part = itertools.islice(range(end), start, end, step)
end = [end]
iterables = itertools.chain(part, end)
items, nexts = itertools.tee(iterables)
# items = [0, 10, 20, 30, 40, 50, 56]
nexts = itertools.chain(itertools.islice(nexts, 1, None), [None])
# next = [10, 20, 30, 40, 50, 56, None]
results = itertools.zip_longest(items, nexts)
# [(0, 10), (10, 20), (20, 30), (30, 40), (40, 50), (50, 56), (56, None)]
static = "default"
result = zip(itertools.repeat(static),results)
print(list(result))
请注意,如果可能的话,我希望只使用 itertools
来完成此操作,我真的不想在内存中保存整个字典列表。
在这种情况下,编写您自己的生成器函数可能更具可读性。例如:
def items():
start = 0
end = 56
step = 10
while True:
d = {"current": start,
"next": start + step if start + step < end else end if start < end else None,
"default": "value"}
yield d
if start >= end:
break
else:
start += step
if start > end:
start = end
print(list(items()))
输出:
[{'current': 0, 'next': 10, 'default': 'value'},
{'current': 10, 'next': 20, 'default': 'value'},
{'current': 20, 'next': 30, 'default': 'value'},
{'current': 30, 'next': 40, 'default': 'value'},
{'current': 40, 'next': 50, 'default': 'value'},
{'current': 50,'next': 56, 'default': 'value'},
{'current': 56, 'next': None, 'default': 'value'}]
从你的元组序列,你可以做一个列表理解(或生成器表达式),如:
[{"current": str(x), "next": str(y), "default": "value"} for x, y in data]
测试代码:
data = ((0, 10), (10, 20), (20, 30), (30, 40), (40, 50), (50, 56), (56, None))
print([{"current": str(x), "next": str(y), "default": "value"} for x, y in data])
结果:
[
{'current': '0', 'next': '10', 'default': 'value'},
{'current': '10', 'next': '20', 'default': 'value'},
{'current': '20', 'next': '30', 'default': 'value'},
{'current': '30', 'next': '40', 'default': 'value'},
{'current': '40', 'next': '50', 'default': 'value'},
{'current': '50', 'next': '56', 'default': 'value'},
{'current': '56', 'next': 'None', 'default': 'value'}
]
目前我有一个生成的迭代器:
(0, 10), (10, 20), (20, 30), (30, 40), (40, 50), (50, 56), (56, None)
我想要制作的东西:
[["current": "0", "next":"10", "default": "value"], ["current": "10", "next":"20", "default": "value"]],
我目前拥有的:
('default', (0, 10)), ('default', (10, 20)), ('default', (20, 30)), ('default', (30, 40)), ('default', (40, 50)), ('default', (50, 56)), ('default', (56, None))
我可以做哪些更改来从我的元组列表中生成字典?
这是重现我所拥有内容的代码:
start = 0
end = 56
step = 10
part = itertools.islice(range(end), start, end, step)
end = [end]
iterables = itertools.chain(part, end)
items, nexts = itertools.tee(iterables)
# items = [0, 10, 20, 30, 40, 50, 56]
nexts = itertools.chain(itertools.islice(nexts, 1, None), [None])
# next = [10, 20, 30, 40, 50, 56, None]
results = itertools.zip_longest(items, nexts)
# [(0, 10), (10, 20), (20, 30), (30, 40), (40, 50), (50, 56), (56, None)]
static = "default"
result = zip(itertools.repeat(static),results)
print(list(result))
请注意,如果可能的话,我希望只使用 itertools
来完成此操作,我真的不想在内存中保存整个字典列表。
在这种情况下,编写您自己的生成器函数可能更具可读性。例如:
def items():
start = 0
end = 56
step = 10
while True:
d = {"current": start,
"next": start + step if start + step < end else end if start < end else None,
"default": "value"}
yield d
if start >= end:
break
else:
start += step
if start > end:
start = end
print(list(items()))
输出:
[{'current': 0, 'next': 10, 'default': 'value'},
{'current': 10, 'next': 20, 'default': 'value'},
{'current': 20, 'next': 30, 'default': 'value'},
{'current': 30, 'next': 40, 'default': 'value'},
{'current': 40, 'next': 50, 'default': 'value'},
{'current': 50,'next': 56, 'default': 'value'},
{'current': 56, 'next': None, 'default': 'value'}]
从你的元组序列,你可以做一个列表理解(或生成器表达式),如:
[{"current": str(x), "next": str(y), "default": "value"} for x, y in data]
测试代码:
data = ((0, 10), (10, 20), (20, 30), (30, 40), (40, 50), (50, 56), (56, None))
print([{"current": str(x), "next": str(y), "default": "value"} for x, y in data])
结果:
[
{'current': '0', 'next': '10', 'default': 'value'},
{'current': '10', 'next': '20', 'default': 'value'},
{'current': '20', 'next': '30', 'default': 'value'},
{'current': '30', 'next': '40', 'default': 'value'},
{'current': '40', 'next': '50', 'default': 'value'},
{'current': '50', 'next': '56', 'default': 'value'},
{'current': '56', 'next': 'None', 'default': 'value'}
]