我有一个列表L
,其中每个元素都是一个size列表n
。我正在尝试n+1
在中的每对列表之间找到所有大小唯一的“联合” L
。例如,unique_unions_n(L,n)
设为执行我想要的功能
L = [['a','c'],
['b','c'],
['b','e'],
['c','e']]
n = 2
unique_unions_k(L, n) -> [['a', 'b', 'c'], ['e', 'a', 'c'], ['e', 'c', 'b']]
注意,['a','c'] union ['b','e']
不包含,因为它的并集(['a','b','c','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', 'c'],
['e', 'a', 'c'],
['e', 'c', 'b'],
['e', 'c', 'b'],
['c', 'e', 'b']]
这是不可取的,因为我认为['e','c','b']
并且['c','e','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','c'],
['b','e'],
['c','e']]
n = 2
print(unique_unions_n(L, n))
# {frozenset({'b', 'e', 'c'}), frozenset({'c', 'a', 'e'}), frozenset({'c', 'a', 'b'})}
如果您需要其他格式的输出,则可以轻松转换为列表/元组列表。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句