【问题标题】:Creating all combinations from a nested list of lists of arbitrary depth从任意深度列表的嵌套列表创建所有组合
【发布时间】:2015-10-23 13:26:00
【问题描述】:

我编写了一个递归函数,它迭代地生成具有 N 个原子的六边形晶格的可能图案。该函数首先在晶格上选择一个点,删除所有与原始点太接近的点,然后将下一个原子放置在剩余的有效位置之一上。

此函数根据要放置的原子数返回一个嵌套的列表列表。

例如对于两个原子,它将返回如下列表: configs = [[site1, [valid_sites]], [site2, [valid_sites]], ...]

对于三个原子: 配置 = [[site1, [site2_1,[valid_sites]]],[site1, site2_2,[valid_sites]], ...]

最多任意深度的原子数。每个站点对象都是一个 2d-numpy 数组。

现在我只需要一种从这个嵌套列表中产生所有有效配置的可迭代的方法:

[[site1, valid_sites[0]], [site1, valid_sites[1]], ... [site2,valid_sites[0]]]

我已经尝试过 itertools.product() 但这有几个问题。在 N=2 的情况下,它将 site1 视为可迭代的,并通过拆分向量 (site1[0], valid_sites[0]) 来生成笛卡尔积......一个简单的测试还表明它不会以所需的方式处理嵌套。

我查看了 herehere 但这些似乎不需要 N 深度的一般性,而后者不编译列表。

这是我对递归函数的尝试:

def expand_list(configs,n,N):
if n<N:
expand_list(configs[n],n+1,N)
else:
return list(itertools.product(*configs))

最好尝试“取消嵌套”循环,然后进行笛卡尔积吗?或者是否可以编写一些生成器函数来执行此操作?

【问题讨论】:

  • 你关心site2_1site2_2等吗?
  • 是的。这些也将代表不同的站点配置。因此,理想情况下,该算法将通过 [site2_1,[...]] 向下递归产生所有内容,然后将堆栈弹出回 [site2_2,[...]] 等等。

标签: python list recursion nested combinations


【解决方案1】:

所以你想要做的是删除列表中的最后一项,并用最后一项扩展列表,对吗?

这是一个递归解决方案:

def expand_sites(sites):
    return [getsubsite(site) for site in sites]


def getsubsite(site):
    if len(site) == 1:
        return site
    else:
        return site[:1] + getsubsite(site[1])

这是一个非递归的解决方案:

def expand_sites(sites):
    return [getsubsite(site) for site in sites]


def getsubsite(site):
    site = site[:]  # copy the list
    while len(site[-1]) > 1:
       site.extend(site.pop())
    site.extend(site.pop())
    return site

还有一个非递归的解决方案,它改变原始列表而不是创建一个新列表:

def expand_sites(sites):
    for site in sites:
        while len(site[-1]) > 1:
            site.extend(site.pop())
        site.extend(site.pop())

【讨论】:

  • 干杯。我试过这些代码sn-ps。但似乎在每种情况下,这些函数都只返回相同的嵌套列表。理想情况下,我会在树上递归构建一个解决方案(比如三个原子)[site1,site2,site3],[site1,site2,site3_1] 等。我想我对你所说的“删除最后一个”的意思有点困惑物品”。再次感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多