【问题标题】:Alternatives to for loops traversing 3 lists of dicts遍历 3 个字典列表的 for 循环的替代方案
【发布时间】:2019-11-13 09:08:41
【问题描述】:

所以我看过一些我试图查看的帖子,但我的用例有点不同。我有 3 个列表,其中包含多个 dicts,要从中获取信息,我有时必须通过 2 个或有时全部 3 个。

目前我这样做:

item_dict = {}
excludes = ["excluded devices"]
confirm = "value"
for item in first_list_dict:
    for second_item in second_list_dict:
            for key, value in item.items():
                if value == confirm and item["key"] == "value" and item["key2"] not in excludes and item["key3"] == second_item["key"]:
                     if second_item["key"] not in item_dict:
                         item_dict[second_item["key"]] = [{item["key"]: {"info": item["key"], "mac_address": item["key"]}}]
                     else:
                         item_dict[second_item["key"]].append({item["key"]: {"info": item["key"], "mac_address": item["key"]}})

这看起来......一团糟,所以让我解释一下我在做什么。

2 个字典列表,其中包含一些单独的数据,但可以通过它们在每个字典中都有的键链接在一起。

for 循环本质上是用来确认某些条件存在于单独的列表中,外部值和字典中的键匹配,将项目添加到字典中。

我想知道的是,如果有替代方法可以使用这个嵌套的 for 循环,并且可以解释它是如何工作的,我将非常感激。如果您希望我回答任何问题,请随时提出,以便我进一步解释。

【问题讨论】:

  • 也许你可以看看anyall 函数,你也可以使用in 运算符的一些列表理解?
  • 您可以为first_list_dictsecond_list_dict 添加一个小例子吗?我现在所看到的:如果 item_dictdefaultdict,则可以删除 if-else 块。

标签: python python-3.x list dictionary for-loop


【解决方案1】:

这里有一些重构开始:

from collections import defaultdict

item_dict = defaultdict(list)
excludes = ["excluded devices"]
confirm = "value"
for item in first_list_dict:
    for value in item.values():
        val1 = item["key"]
        if not (val1 == "value" and value == confirm and item["key2"] not in excludes):
            continue
        for second_item in second_list_dict:
            val2 = second_item["key"]
            if item["key3"] == val2:
                item_dict[val2].append({val1: {"info": val1, "mac_address": val1}})

【讨论】:

  • 重构看起来确实比以前干净了很多,这已经有帮助了。我对 defaultdict 列表感到困惑,这似乎没有添加新的 dict 条目,只附加现有条目?我想我可以创建一个 else 语句来做到这一点。或者,也许我错过了 defaultdict 的工作原理?可以再解释一下吗?
猜你喜欢
  • 2015-10-30
  • 2023-03-18
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 2014-06-27
  • 1970-01-01
  • 1970-01-01
  • 2021-06-11
相关资源
最近更新 更多