繁体   English   中英

如何迭代两个字典并将它们保存在python列表中

[英]How to iterate over two dictionaries and save them in a list in python

我正在尝试迭代两个字典d = {'d': 2, 'c': 6, 'a': 1, 'b': 3}d2 = {'j': 9, 'b': 5, 'a': 2, 'k': 10} 它应该存储[[key1, value1 value2], [key1, value1, value2], [key2, value1, value2]...]首先,尝试将d值存储在my_listmy_list = [d[keys], d[values], 0]

我的代码如下

my_list = []
for i, j in d.items():
if i in my_list:
    print(i, "is in list")
else:
    my_list.append([i,j,0])

output: my_list = [['d', 2, 0], ['c', 6, 0], ['a', 1, 0], ['b', 3, 0]]

然后,遍历d2 ,如果关键d2中存在my_list然后替换0d2[values]别人把它添加到my_list[d2[keys], 0, d2[values]]

当我'd' in my_list选中'd' in my_list ,它为'd' in my_list[0][0]提供了FalseTrue

因此,为了获得my_list[0][0]位置,我使用了另一个for loop ,例如

for k in range(len(d2)):
    for i, j in d2.items():
        if i in my_list[k][0]:
            my_list[k][2] = d2[j]
        else:
            my_list.append([i,0,j])

这给了我错误

    Traceback (most recent call last):
  File "<pyshell#505>", line 4, in <module>
    my_list[k][2] = d2[j]
KeyError: 2

我在这里想念的是什么?

谁能告诉我如何在不复制列表的情况下添加键及其值?

谢谢

您可以通过三个步骤来形成结果。 首先,通过创建键的交集,创建包含两个字典中都存在的键的列表。 然后添加仅在第一个字典中存在的键,最后添加仅在第二个字典中存在的键。

d = {'d': 2, 'c': 6, 'a': 1, 'b': 3}
d2 = {'d': 9, 'b': 5, 'a': 2, 'k': 10}

result = [[k, d[k], d2[k]] for k in d.keys() & d2.keys()]
result.extend([k, d[k], 0] for k in d if k not in d2)
result.extend([k, 0, d2[k]] for k in d2 if k not in d)

print(result)

输出:

[['b', 3, 5], ['d', 2, 9], ['a', 1, 2], ['c', 6, 0], ['k', 0, 10]]

您也可以使用union和dict.get做到这一点:

>>> d = {'d': 2, 'c': 6, 'a': 1, 'b': 3}
>>> d2 = {'d': 9, 'b': 5, 'a': 2, 'k': 10}
>>> [[k, d.get(k, 0), d2.get(k, 0)] for k in d.keys() | d2.keys()]
[['k', 0, 10], ['c', 6, 0], ['d', 2, 9], ['a', 1, 2], ['b', 3, 5]]

正如@JimDennis所述,以上仅适用于Python 3,因为在Python 2上, keys返回一个列表。 通过从返回值构造一个集合可以减轻这种情况:

[[k, d.get(k, 0), d2.get(k, 0)] for k in set(d.iterkeys()) | set(d2.iterkeys())]

这会做

d = {'d': 2, 'c': 6, 'a': 1, 'b': 3} 
d2 = {'j': 9, 'b': 5, 'a': 2, 'k': 10}

list=[]
for key,value in d.iteritems():
  if key in d2:
    list.append([key,d[key],d2[key]])
  else:
    list.append([key,d[key],0])

for key,value in d2.iteritems():
  if key not in d:
    list.append([key,0,d2[key]])

print list

输出:

[['a', 1, 2], ['c', 6, 0], ['b', 3, 5], ['d', 2, 0], ['k', 0, 10], ['j', 0, 9]]

以下作品:

l=[]                                           #store desired output
#go through elements of First dictionary (d1)
for key,val in d1.items(): 
   try: 
     #create the list and pop the element in d2 that matched with key of d1 
     temp = [key,val,d2.pop(key)] 
   except: 
     temp = [key,val,0] 
   l.append(temp) 

#print(l)
#[['d', 2, 9], ['c', 6, 0], ['a', 1, 2], ['b', 3, 5]]

#d2 may have elements left, go through them
for key,val in d2.items():
  temp=[key,0,val]
  l.append(temp)

print(l)

#驱动程序值

IN : d1= {'d': 2, 'c': 6, 'a': 1, 'b': 3}
IN : d2 = {'d': 9, 'b': 5, 'a': 2, 'k': 10}
OUT: [['d', 2, 9], ['c', 6, 0], ['a', 1, 2], ['b', 3, 5], ['k', 0, 10]]

Python中的字典键是集合(在数学意义上)。 在Python3中,它们的设置类似于对象,并且可以与Python的set运算符一起使用。

在早期版本的Python中,字典.keys()方法返回一个列表,并且必须将其显式转换为set()才能在其上使用set运算符/方法。

因此,满足您的要求的简单功能很简单:

def merge_dicts_to_list(this, that):
    common = set(this.keys()) & set(that.keys())
    these  = set(this.keys()) - set(that.keys())
    those  = set(that.keys()) - set(this.keys())
    results = [[k, this[k], that[k]] for k in common]
    results.extend([[k, this[k]] for k in these])
    results.extend([[k, that[k]] for k in those])
    return results

我会同意“ this”和“ that”……“ these”和“ these”不是最受启发的变量名(“ left”和“ right”可能更传统。“ d”和“ d1”是难以阅读)。

这个例子是故意冗长的。 我最初将其写成三行,但认为这些集合表达式的复杂性更难阅读和推理。 这样就应该很清楚了。 交集是共有的键,每种方式的集合不同,它们给出的键只能在一个或另一个中找到; 我们只需使用这些键集构建一个列表列表。

总的来说,程序员忘记集合和集合运算符实在是太普遍了。 然后,他们最终重新实现代码以执行这些操作,从而创建了更多要维护的代码,为自己的错误提供了更多机会,并且错过了使用其语言内置功能可能带来的性能优势。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM