加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 迭代值列表的字典

发布时间:2020-12-20 12:41:14 所属栏目:Python 来源:网络整理
导读:我有这样的字典 data = { 'a': [95,93,90],'b': [643,611,610]} 我想迭代dict并从每个项的值列表中获取键和值,类似这样 {'a': 95,'b': 643}{'a': 93,'b': 611}{'a': 90,'b': 610} 我已经为此实现了逻辑并且它工作正常,但是当我看到在进程中创建的temp_dict时
我有这样的字典

data = {
    'a': [95,93,90],'b': [643,611,610]
}

我想迭代dict并从每个项的值列表中获取键和值,类似这样

{'a': 95,'b': 643}
{'a': 93,'b': 611}
{'a': 90,'b': 610}

我已经为此实现了逻辑并且它工作正常,但是当我看到在进程中创建的temp_dict时,我看到许多中间不必要的循环.最终的结果很好,但我认为它可以改进很多.

import timeit

data = {
    'a': [95,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)

如何更有效地做到这一点?

解决方法

尝试这样的事情 –

>>> data = {
...     'a': [95,...     'b': [643,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}]

当使用*作为参数将列表传递给函数时,它会将列表分解为单个元素并将其传递给函数.示例 – 如果我们传递[[1,2],[3,4]]它将作为两个不同的参数传递 – [1,2]和[3,4] – 检查此here(部分 – 函数调用中的*)

举例解释一下 –

>>> lst = [[1,2,3],[4,5,6],[7,8,9]]
>>> def func(a,b,c):
...     print(a)
...     print(b)
...     print(c)
...
>>> func(*lst)
[1,3]
[4,6]
[7,9]

zip – 此函数返回元组列表,其中第i个元组包含来自每个参数序列或迭代的第i个元素.

更具规模的模型 –

>>> lst = list(data.items())
>>> lst
[('a',[95,90]),('b',[643,610])]
>>> lst1 = list(zip(*[i[1] for i in lst]))
>>> lst1
[(95,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': 610}]

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读