Suppose A = [[0, 1], [1, 2]], which stores two 2-combinations from {0, 1, 2, 3}, and B = [[0, 1, 2], [0, 1, 3], [0, 2, 3], [1, 2, 3]], which stores all possible 3-combinations from {0, 1, 2, 3}.
How to find all elements in B that contain at least one of the 2-combinations from A?
My desired output is C = [[0, 1, 2], [0, 1, 3], [1, 2, 3]], where [0, 1, 2] includes both [0, 1] and [1, 2], [0, 1, 3] includes [0, 1], and [1, 2, 3] includes [1, 2].
Thanks! (It would be great if the answer code is efficient and fast, as I need to do this for A and B that are of large scale)
I tried the following codes:
import numpy as np
import itertools
A = [[0, 1], [1, 2]]
B = []
Cdup = []
rows = range(4)
for combo in itertools.combinations(rows, 3):
B.append(list(combo))
print(B)
for b in B:
for a in A:
if a.issubset(b):
Cdup.append(b)
C = np.unique(Cdup)
But there is an error that says list object has no attribute issubset.
CodePudding user response:
You could scan each element b of listB and check if any element a of listA is a subset of b, in that case keep b.
Coding:
[b for b in listB if any(set(a).issubset(set(b)) for a in listA)]
CodePudding user response:
Here is a solution using itertools.combinations, comprehensions, and set:
from itertools import combinations
A = [(0, 1), (1, 2)]
B = list(combinations(range(4), 3))
C = set(b for a in A for b in B if a in set(combinations(b, len(a))))
print(C)
Which results in:
{(0, 1, 2), (0, 1, 3), (1, 2, 3)}
The solution above assumes that len(a) <= len(b) where a and b are elements of A and B, respectively. What it does is simply check if each element of A is an element of the combinations of each element of B, combined by the len() of elements of A.
CodePudding user response:
Hope this code can be a solution for your scenario, let me know if you think it needs any explanations:
listA=[[0,1],[1,2]]
listB=[[0,1,2],[0,1,3],[0,2,3],[1,2,3]]
res = []
for comA in listA:
strA = " ".join(str(e) for e in comA)
for comB in listB:
strB = " ".join(str(el) for el in comB)
if strA in strB:
res.append(list(comB))
# use tuple if you want to remove duplicates easily:
# res.append(tuple(comB))
print(res)
# if the res list contain tuples the to remove duplicates we can use:
# mylist = list(dict.fromkeys(res))
# print(mylist)
