问题描述
我有一个列表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']]