繁体   English   中英

从列表列表中获取约束的唯一元素列表

[英]Get a constrained list of unique elements from a list of lists

我必须使用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包?

谢谢

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

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']

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM