Как получить имена переменных попарных комбинаций?

У меня есть несколько попарных сравнений, чтобы найти общие элементы между списками. Мой код ниже работает. Однако я хотел бы следить за именами списков. которые являются 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()

Каков ваш ожидаемый результат? Я не уверен, что полностью следую.

BrokenBenchmark 17.05.2022 22:43

ожидаемый результат: 1 общий элемент между (geno1 и geno2) [2] 2 общих элемента между geno1 и geno3 [1, 2] 2 общих элемента между geno2 и geno3 [2, 5]

Amilovsky 17.05.2022 22:45
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения текстовых сообщений может быть настолько сложным или простым, насколько вы его сделаете. Как и в любом ML-проекте, вы можете выбрать...
7 лайфхаков для начинающих Python-программистов
7 лайфхаков для начинающих Python-программистов
В этой статье мы расскажем о хитростях и советах по Python, которые должны быть известны разработчику Python.
Установка Apache Cassandra на Mac OS
Установка Apache Cassandra на Mac OS
Это краткое руководство по установке Apache Cassandra.
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
В одном из недавних постов я рассказал о том, как я использую навыки количественных исследований, которые я совершенствую в рамках программы TPQ...
Создание персонального файлового хранилища
Создание персонального файлового хранилища
Вы когда-нибудь хотели поделиться с кем-то файлом, но он содержал конфиденциальную информацию? Многие думают, что электронная почта безопасна, но это...
Создание приборной панели для анализа данных на GCP - часть I
Создание приборной панели для анализа данных на GCP - часть I
Недавно я столкнулся с интересной бизнес-задачей - визуализацией сбоев в цепочке поставок лекарств, которую могут просматривать врачи и...
1
2
28
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Создайте словарь, где ключи — это имя списка, а значения — это списки, которые у вас есть изначально. Вы можете что-то сделать, используя 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')

Другие вопросы по теме

Я пытаюсь получить значение от радиокнопки в tkinter, но получаю сообщение об ошибке «NameError: имя« var »не определено». Ниже весь мой код. с
Как получить доступ к переменной вне функции класса, если она не была передана в функцию
Как проверить, как часто нажимались динамически созданные кнопки, по отдельности и в целом?
Почему я могу вставить только номер, а не имя?
Javascript: как использовать «глобальную переменную» для двух разных html-страниц?
Сообщение об ошибке SQL: оператор SELECT INTO не может содержать оператор SELECT, который присваивает значения переменной
Приведение объекта к его классу
Как создать новую переменную (столбец) на основе определенного заданного столбца, содержащего циклы чисел от 0 до n, где n — положительное целое число
Как проверить, действительна ли переменная или инициализирована она или нет в C?
Python получает новое значение в классе или методе