从列表列表

时间:2016-09-08 14:41:06

标签: python list data-structures

我必须使用Python解决这个优化问题。我有一个列表列表,每个列表都包含元素。例如:

l = [
       ['elem1'],
       ['elem2'],
       ['elem3','elem4'],
       ['elem4','elem5']
    ]

我需要获得的是列表r,以便:

1)两个列表的长度应相同

>>> len(r)==len(l)
True

2)每个选定元素应对应于相同索引列表的元素

>>> correct=True
>>> for r_element in r:
...     if r_element not in l[r.index(r_element)]:
...         correct=False
...         break
...         
>>> correct
True

3)元素应该是唯一的

>>> len(r) > len(set(r))
False

这里可能的结果将是:

r = ['elem1','elem2','elem3','elem4']

有最佳方法吗?或者可能不使用列表,而是使用其他一些数据结构或某些特定的Python包?

由于

1 个答案:

答案 0 :(得分:0)

这是一种使用递归回溯来进行选择和回溯的方法,如果它们不起作用的话。如果没有列表可以满足约束条件,则函数以字符串的形式返回失败。

l = [
       ['elem1', 'elem5'],
       ['elem2'],
       ['elem3','elem4'],
       ['elem1','elem2']
    ]

def constrained_list(l):
    r = []                # final list
    used = set()          # values used
    if recurse(r, used, l): return r        # if successul in finding contrained list, return it
    return "No valid list"

def recurse(r, used, l):
    if not l: return True       # base case, l has been completely processed
    line = l[0]                 # look at first line in l
    for word in line:
        if word not in used:
            used.add(word)      
            r.append(word)      # try adding this word
            if recurse(r, used, l[1:]): return True     # recurse on the rest of l, from 1 to end
            used.remove(word)   # if this choice didnt work, backtrack.
            r.pop()
    return False                

输出:

['elem5', 'elem2', 'elem3', 'elem1']