如何将代码扁平化为列表理解?

Tom*_*ski 0 python list-comprehension python-3.x

我有这段代码:

for aaa_binary in groups(sources, a):

    if len(dodane_pary)!=count:

       g.add_nodes_from (aaa_binary)
       t1 = (aaa_binary[0],aaa_binary[1])
       t2 = (aaa_binary[1],aaa_binary[2])
       t3 = (aaa_binary[2],aaa_binary[3])                                                 

       added_now = []                      
       for edge in (t1,t2,t3):
           if not g.has_edge(*edge):
              g.add_edge(*edge)
              added_now.append(edge)

       dodane_pary.append(aaa_binary)  

       for j in range(len(dodane_pary)):
           if nx.shortest_path(g, aaa_binary[0], aaa_binary[3])!=aaa_binary or nx.shortest_path(g, dodane_pary[j][0], dodane_pary[j][3])!=dodane_pary[j]:
              for edge in added_now:
                  g.remove_edge(*edge)
              dodane_pary.remove(aaa_binary)
              break
    else: 
        break
Run Code Online (Sandbox Code Playgroud)

因此,我可能无法在我的程序中使用多处理,所以我想首先测试代码的速度,然后将其作为列表展平.

怎么做得最好?用碎片压扁是否更好?例如,对于for/if?或者更大的碎片?

Mar*_*ers 5

你不能.您无法删除已添加到列表中的元素,但这是您的代码所做的.你也使用break,列表理解循环不支持爆发.最后但并非最不重要的是,您要向多个数据结构添加数据,而列表推导构建单个列表对象.

此外,当你的循环变得这么冗长时,你真的不想尝试把它变成列表理解.结果代码将是一个难以理解的混乱.

列表理解是不是要快得多无妨; 列表推导从常规循环执行重复列表追加中移除一个恒定的时间因子,它不是一个神奇的子弹.这是因为列表解析避免了.append属性查找和方法调用.而已.

也就是说,您的代码看起来真的想要了解any()函数生成器表达式,以测试您的图形更改是否仍然产生最短路径:

aaa_binary_groups = iter(groups(sources, a))

while len(dodane_pary) < count:
    aaa_binary = next(aaa_binary_groups, None)
    if aaa_binary is None:
        # no more groups to process
        break

    # add all edges to graph, then test for shortest paths
    g.add_nodes_from(aaa_binary)
    new_edges = [edge for edge in zip(aaa_binary, aaa_binary[1:]) 
                 if not g.has_edge(*edge)]
    g.add_edges_from(new_edges)

    if (nx.shortest_path(g, aaa_binary[0], aaa_binary[3]) != aaa_binary or
            any(nx.shortest_path(g, entry[0], entry[3]) != entry
                for entry in dodane_pary)):
        # not a shortest path for every existing entry, so remove again
        g.remove_edges_from(new_edges)
    else:
        # suitable match, retain addition to graph and track added node group
        dodane_pary.append(aaa_binary)
Run Code Online (Sandbox Code Playgroud)

所述zip(aaa_binary, aaa_binary[1:])迭代产生相同的边缘元组的t1,t2等变量手动定义,设置有总是在四个元素aaa_binary.

我还研究是否必须添加节点和边缘; 也许你可以避免每次要添加新组时必须测试到目前为止添加的每个边缘.如果您可以找到这样的更改,那么您可以考虑使用功能方法来添加节点组(因为您可以直接过滤组而不先添加它们).一旦您可以过滤组,您就可以将它们添加到图形(带有它们的边缘),之后,在一个简单的循环中.