我有这样的字典
data = {
'a': [95, 93, 90],
'b': [643, 611, 610]
}
Run Code Online (Sandbox Code Playgroud)
我想迭代dict并从每个项的值列表中获取键和值,类似这样
{'a': 95, 'b': 643}
{'a': 93, 'b': 611}
{'a': 90, 'b': 610}
Run Code Online (Sandbox Code Playgroud)
我已经为此实现了逻辑并且它工作正常,但是当我看到正在temp_dict创建的过程中,我看到许多中间不必要的循环.最终的结果很好,但我认为它可以改进很多.
import timeit
data = {
'a': [95, 93, 90],
'b': [643, 611, 610]
}
def calculate(**kwargs):
temp_dict = {}
index = 0
len_values = list(kwargs.values())[0]
while index < len(len_values):
for k, v in kwargs.items():
temp_dict[k] = v[index]
index += 1
yield temp_dict
start_time = timeit.default_timer()
for k in (calculate(**data)):
print(k)
print(timeit.default_timer() - start_time)
Run Code Online (Sandbox Code Playgroud)
如何更有效地做到这一点?
Ana*_*mar 13
尝试这样的事情 -
>>> data = {
... 'a': [95, 93, 90],
... 'b': [643, 611, 610]
... }
>>> lst = list(data.items())
>>> lst1 = list(zip(*[i[1] for i in lst]))
>>> lst1
[(95, 643), (93, 611), (90, 610)]
>>> newlist = []
>>> for aval, bval in lst1:
... newlist.append({lst[0][0]:aval , lst[1][0]:bval})
...
>>> newlist
[{'a': 95, 'b': 643}, {'a': 93, 'b': 611}, {'a': 90, 'b': 610}]
Run Code Online (Sandbox Code Playgroud)
当使用*作为参数将列表传递给函数时,它会将列表分解为单个元素并将其传递给函数.示例-如果我们通过[[1,2],[3,4]]这将作为两个不同的参数传递- [1,2]和[3,4]- checkt这个位置(部分-*函数调用)
举例解释一下 -
>>> lst = [[1,2,3],[4,5,6],[7,8,9]]
>>> def func(a, b, c):
... print(a)
... print(b)
... print(c)
...
>>> func(*lst)
[1, 2, 3]
[4, 5, 6]
[7, 8, 9]
Run Code Online (Sandbox Code Playgroud)
zip - 此函数返回元组列表,其中第i个元组包含来自每个参数序列或迭代的第i个元素.
更具规模的模型 -
>>> lst = list(data.items())
>>> lst
[('a', [95, 93, 90]), ('b', [643, 611, 610])]
>>> lst1 = list(zip(*[i[1] for i in lst]))
>>> lst1
[(95, 643), (93, 611), (90, 610)]
>>> newlist = []
>>> for x in lst1:
... d = {}
... for i,y in enumerate(lst):
... d[y[0]] = x[i]
... newlist.append(d)
...
>>> newlist
[{'a': 95, 'b': 643}, {'a': 93, 'b': 611}, {'a': 90, 'b': 610}]
Run Code Online (Sandbox Code Playgroud)