Python-比嵌套循环更好的迭代复杂列表的方法

时间:2018-08-08 05:35:46

标签: python for-loop nested-loops

我正在使用以下格式迭代python中的复杂列表:

[
  {
    <parent id>: [
      <child id>,
      <child id>
    ],
    <parent id>: [
      <child id>
    ]
  },
  {
    <parent id>: [
      <child id>,
      <child id>,
      <child id>
    ],
    <parent id>: [
      <child id>
    ]
  }
]

列表将dict作为元素。这些字典具有<parent id>的键和<child id>

的列表的值

在不同的格中可以有相同的<parent id>,但是<child id>只能属于一个<parent id>。一个例子是这样的:

[
  {
    2: [1, 5],
    3: [3, 7],
    4: [6]
  },
  {
    1: [2, 4, 8],
    4: [6]
  }
]

父母id 4在两个dict元素中,但是所有孩子id都是父母id唯一的。

现在,我要迭代此数据结构作为输入,因为我想确保满足所有子代对父代ID唯一的条件。这是我的代码:

def check_format(self, mapping):
    # mapping is the data structure
    unique_parent_list = []
    child_list = []

    for x in range(0, 2):
        for parent in mapping[x].keys():
            if parent not in unique_parent_list:
                unique_parent_list.append(parent)
                for child in mapping[x][parent]:
                    child_list.append(child)
    if len(child_list) > len(set(child_list)):
        return 'Condition not met'
    else:
        return 'Condition met'

这可行,但是我不喜欢O ^ 4复杂性之类的。有没有一种方法可以简化或编码以获得更好的性能?

2 个答案:

答案 0 :(得分:3)

您显然具有从孩子到父母的映射关系。我能想到的最简单的事情就是以孩子为键来做出命令。如果遇到已经在里面的孩子,请检查其父值。

查找和插入在恒定时间内进行(dict键实际上是一个哈希集)。您还可以更有效地使用短路,因为这样一来,您就可以停止找到有多个父母的孩子:

def check_format(map_list):
    check = {}
    for parent, children in (i  for d in map_list for i in d.items()):
        for child in children:
            if check.setdefault(child, parent) != parent:
                return False
    return True

这将对每个孩子准确地进行一次迭代,并使用dict.setdefault对每个孩子执行恒定时间(理想情况下)的操作。

答案 1 :(得分:0)

您确定这是O(3)复杂性吗?关于什么?

这个代码对您来说太慢了吗?如果您想浏览所有孩子,那么实际上除了遍历这些孩子外,别无其他。

但是。考虑设置unique_parent_listchild_list而不是列表。这可能会使in的检查速度更快(与O(1)相比,O(log(n))。但是如果您在乎,则应进行概要分析以确保确实如此。

如果您将孩子放在child_list中的情况下进行了检查,则还可以在找到重复的孩子后立即退出(如果格式不正确)。