Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 迭代2个DICT并比较值,然后追加内部列表_Python_List_Dictionary_For Loop_Compare - Fatal编程技术网

Python 迭代2个DICT并比较值,然后追加内部列表

Python 迭代2个DICT并比较值,然后追加内部列表,python,list,dictionary,for-loop,compare,Python,List,Dictionary,For Loop,Compare,我面临这样一种情况:我需要用相同的最外层键迭代嵌套的dict,比较其他dict的内部键值和内部键值,然后追加。下面将有助于理解: {AD:{(62,'VMX','Barcelona','ES'): ['123','567','666'}} #dict1 many more rows {AD:{(151,'CMXS','','ES','62'): ['345','6754']}} #dict 2 many more rows 所以我需要迭代这两个dict,比较dict1的元组键

我面临这样一种情况:我需要用相同的最外层键迭代嵌套的dict,比较其他dict的内部键值和内部键值,然后追加。下面将有助于理解:

{AD:{(62,'VMX','Barcelona','ES'): ['123','567','666'}} #dict1  many more rows

{AD:{(151,'CMXS','','ES','62'): ['345','6754']}}       #dict 2 many more rows

所以我需要迭代这两个dict,比较dict1的元组键[0]=dict2的元组键[4],如果它们匹配dict1中的append internal list和dict2中的internal list

在这之后,1看起来像

{AD:{(62,'VMX','Barcelona','ES'): ['123','567','666','345','6754'}}

编写了此代码,但未按预期工作

for k,v in dict1.items():
    if len(v)!= 0:
        for c,a in dict2.items():
            if len(a)!= 0:
                for k2,v2 in v.items():
                    for c2,a2 in a.items():
                        if str(k2[0]) == c2[4]:
                            v2.append(a2)


只要示例继续,for循环就会正确放置

你说的意外是什么意思? 你是说这个吗

{'AD': {(62, 'VMX', 'Barcelona', 'ES'): ['123', '567', '666', ['345', '6754']]}}
阵列中的额外阵列

因为如果是这样,答案将是将.append()与.extend()切换

输出

/tmp $ python test.py.py
{'AD': {(62, 'VMX', 'Barcelona', 'ES'): ['123', '567', '666', '345', '6754']}}
根据评论,因为您想知道如何避免其中一个循环,所以这里有一个更新版本

for k,v in dict1.items():
    a = dict2.get(k)
    if a is None or len(v) == 0:
        continue

    for k2,v2 in v.items():
        for c2,a2 in a.items():
            if str(k2[0]) == c2[4]:
                v2.append(a2)

只有两级深度,对吗?是的,只有两级深度,但这个嵌套循环的问题是,它还附加了str(k2[0])==c2[4])的所有其他情况。如最外面的键与AD不同。如果希望最外面的键相同,请添加
和k==c
条件。i、 e.
如果(k==c)和(str(k2[0])==c2[4])
或者,跳过第二个for循环,只循环具有相同外键的字典
a=dict2[k]
@algrebe Hi您的第一条评论使它起作用。你能解释一下你说的摆脱第二个for循环是什么意思吗?讨厌2个嵌套循环。很多不必要的比较,考虑到这对于大的dict来说并不有效,或者如果我需要比较3个dict,有没有比使用2个嵌套循环更好的方法?追加/扩展不是问题所在。问题在于附加的值。@algrebe的评论修复了这个问题。但我仍然想知道一个更好的方法,这使它更干净。我认为有一种方法可以避免再做一次口述,但这确实起到了作用。谢谢。我也用我在评论中的意思更新了它。请对此发表评论。由于未对dict1.items()中的k,v迭代next
:if len(v)!=如果str(k2[0])==next(iter(dict2[k]))[4]:v2.append(dict2[k][next(iter(dict2[k])))
@NaiveBayes你能详细说明你的评论吗?你在尝试新东西吗?另一种方法?@NaiveBayes
next(iter(dict2[k]))
。首先,假设k是dict2的一部分。如果不是,您将得到一个键错误。这就是为什么我使用
.get(k)
并检查它是否为None。此外,这将始终将k2[0]与dict2[k]中的单个键进行比较。您希望它与第4个元素匹配k2[0]的每个元组进行比较。所以您无法摆脱a.items()中c2和a2的
for循环。
for k,v in dict1.items():
    a = dict2.get(k)
    if a is None or len(v) == 0:
        continue

    for k2,v2 in v.items():
        for c2,a2 in a.items():
            if str(k2[0]) == c2[4]:
                v2.append(a2)