如何在列表列表中的对之间获取特定大小的所有唯一并集?

问题描述

我有一个列表L,其中每个元素都是一个大小为n的列表。我试图在n+1的每对列表之间找到大小为L的所有唯一“联合”。例如,让unique_unions_n(L,n)是执行我想要的功能函数

L = [['a','c'],['b','e'],['c','e']]
n = 2
unique_unions_k(L,n) -> [['a','b',['e','a','c','b']]

请注意,不包括['a','c'] union ['b','e'],因为它的并集(['a','e']的大小大于n+1

这是我想出的,它在n+1中列表对的所有组合之间产生大小为L的并集,但这不能保证并集是“唯一的”。

import itertools
def union(list1,list2):
  return list(set(list1) | set(list2))

def unique_unions_n(L,n):
  result = []
  for item in itertools.combinations(L,2):
    u = union(item[0],item[1])
    if len(u) == n+1:
      result.append(u)
  return result

在上例中给定相同列表L时,我的尝试会产生

result = [['a','b'],'e','b']]

这是不可取的,因为我认为['e','b']['c','b']不是唯一的。我了解我的功能失败,因为我正在查看每种组合。对于较大的列表,我也试图以最有效的方式做到这一点。我想念什么?

(除了通过示例,我不确定如何问/标题这个问题,所以如果有人有更好的标题标题,请告诉我!)

解决方法

尝试使用一组消除重复项:

import itertools

def unique_unions_n(L,n):
  result = set()
  for item in itertools.combinations(L,2):
    u = frozenset(item[0] + item[1])
    if len(u) == n+1:
      result.add(u)
  return result

L = [['a','c'],['b','e'],['c','e']]
n = 2
print(unique_unions_n(L,n))
# {frozenset({'b','e','c'}),frozenset({'c','a','e'}),'b'})}

如果您需要其他格式的输出,则可以轻松地转换为列表/元组列表。

,

只需在代码末尾添加以下行:

res=[sorted(i) for i in result]
m=[]
for k in res:
    if k not in m:
        m.append(k)
,

def unique_lists(listSet):
    res = [sorted(i) for i in listSet]
    outList = []
    for i in res:
        if i not in outList:
            outList.append(i)
    return outList

def unique_unions_k(L,n):
    k = []
    for x in range(0,len(L)):
        for y in range(x,len(L)):
            unique_set = set(L[x]).union(set(L[y]))
            if len(unique_set) == n+1:
                k.append(list(unique_set))

    return unique_lists(k)

# inputs
n = 2
L = [['a','e']]

print(unique_unions_k(L,n))
# [['a','b',['a','c','e']]