У меня есть несколько попарных сравнений, чтобы найти общие элементы между списками. Мой код ниже работает. Однако я хотел бы следить за именами списков. которые являются geno1, geno2 и geno3. Я не уверен, как получить комбинации, относящиеся к именам переменных, а не к массивам. Хотя есть связанные вопросы о переполнении стека, такие как Получение имен параметров метода, я надеюсь получить довольно простое решение. Заранее спасибо за ваше время.
import itertools #to get all pairwise combinations
geno1 = [1,2,3]
geno2 = [2,5]
geno3 = [1,2,4,5]
genotypes = [geno1,geno2,geno3]
combinations = list(itertools.combinations(genotypes,2))
for pair in combinations:
commonItem = [x for x in pair[0] if x in pair[1]]
print(f'{len(commonItem)} common items between {pair}')#Here instead of pair I want to know which pair of genotypes such as geno1 geno2, or geno1 geno3.
print(commonItem)
print()
ожидаемый результат: 1 общий элемент между (geno1 и geno2) [2] 2 общих элемента между geno1 и geno3 [1, 2] 2 общих элемента между geno2 и geno3 [2, 5]
Создайте словарь, где ключи — это имя списка, а значения — это списки, которые у вас есть изначально. Вы можете что-то сделать, используя locals()
, если не хотите записывать имена списков в виде строк, но это довольно хакерский метод, и я бы не рекомендовал его:
import itertools
geno1 = [1,2,3]
geno2 = [2,5]
geno3 = [1,2,4,5]
genotypes = {"geno1": geno1, "geno2": geno2, "geno3": geno3}
combinations = list(itertools.combinations(genotypes.items(),2))
for (fst_name, fst_lst), (snd_name, snd_lst) in combinations:
commonItem = [x for x in fst_lst if x in snd_lst]
print(f'{len(commonItem)} common items between {fst_name} and {snd_name}')
print(commonItem)
print()
Выход:
1 common items between geno1 and geno2
[2]
2 common items between geno1 and geno3
[1, 2]
2 common items between geno2 and geno3
[2, 5]
Если вы хотите обрабатывать имена как данные, вы должны хранить их как данные. dict
позволит вам хранить имена и значения вместе:
import itertools
genotypes = {
'geno1': [1,2,3],
'geno2': [2,5],
'geno3': [1,2,4,5],
}
combinations = itertools.combinations(genotypes.items(), 2)
for (k1, v1), (k2, v2) in combinations:
commonItem = [x for x in v1 if x in v2]
print(f'{len(commonItem)} common items between {k1} and {k2}')
print(commonItem)
Выход:
1 common items between geno1 and geno2
[2]
2 common items between geno1 and geno3
[1, 2]
2 common items between geno2 and geno3
[2, 5]
Для получения дополнительной информации см.:
Вам, вероятно, лучше положить все это в словарь. Тогда вы можете сначала получить комбинации имен, а фактические списки смотреть только внутри цикла:
import itertools
genotypes = {
'geno1': [1,2,3],
'geno2': [2,5],
'geno3': [1,2,4,5],
}
combinations = list(itertools.combinations(genotypes,2))
for left_name, right_name in combinations:
left_geno = genotypes[left_name]
right_geno = genotypes[right_name]
commonItem = [x for x in left_geno if x in right_geno]
print(f'{len(commonItem)} common items between {left_name} and {right_name}: {commonItem}\n')
Каков ваш ожидаемый результат? Я не уверен, что полностью следую.