我必须使用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包?
由于
答案 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']