<p>不确定这是否正是你想要的,但这是一个开始:)</p>
<pre><code>from itertools import combinations
# Assume input is a list of strings called input_list
input_list = ['OG_1: A|1 A|3 B|1 C|2','OG_2: A|4 B|6','OG_3: C|8 B|9 A|10']
# Create a dict to store relationships and a list to store OGs
rels = {}
species = set()
# Populate the dict
for item in input_list:
params = item.split(': ')
og = params[0]
raw_species = params[1].split()
s = [rs.split('|')[0] for rs in raw_species]
rels[og] = s
for item in s:
species.add(item)
# Get the possible combinations of species:
combos = [c for limit in range(1, len(l)-1) for c in combinations(species,limit)]
def combo_in_og(combo, og):
for item in combo:
if item not in rels[og]:
return False
return True
# Loop over the combinations and print
for combo in combos:
valid_ogs = []
for og in ogs:
if combo_in_og(combo, og):
valid_ogs.append(og)
print('(species) ' + ','.join(combo) + ' (are in groups) ' + ', '.join(valid_ogs))
</code></pre>
<p>产生:</p>
<pre><code>(species) C (are in groups) OG_1, OG_3
(species) A (are in groups) OG_1, OG_2, OG_3
(species) B (are in groups) OG_1, OG_2, OG_3
(species) C,A (are in groups) OG_1, OG_3
(species) C,B (are in groups) OG_1, OG_3
(species) A,B (are in groups) OG_1, OG_2, OG_3
(species) C,A,B (are in groups) OG_1, OG_3
</code></pre>
<p>只是一个警告:如果输入的数量足够大,那么您要做的事情将开始花费很长时间,因为它的复杂性是2^N。您无法绕过它(这就是<a href="https://stackoverflow.com/questions/5508447/2n-complexity-algorithm">the problem demands</a>),但它就在那里。你知道吗</p>