Использование определения списка для соответствия значениям словарей, которые хранятся в списках

У меня есть два списка словарей, которые мне нужно сравнить:

search_list =[{'Chr':'chr1','St':'2345','End':'2456'}, {'Chr':'chr1','St':'3457','End':'4567'}] 

а также

 database = [{'Chr':'chr1','St':'2348','End':'2348'}, {'Chr':'chr1','St':'190','End':'190'}] 

Поэтому каждый словарь в списке выглядит следующим образом:

 {'Chr':'chr1','St':'2345','End':'2456'} 

Где Chr = Хромосома, St = начальная координата и Конец = конечная координата.

Мне нужно определить значения в базе данных, которые соответствуют значению Chr, и находятся между значениями St и End (которые должны быть целыми, а не их текущей строкой). Из того, что я могу рассказать, понимание списка – лучший способ добиться этого. Рассмотрение этого вопроса было моей концептуальной отправной точкой, но я немного смущен о том, как действовать дальше.

Мой псевдокод:

 matched = [var for var in search_list where search_list['Chr'] == database['Chr'] AND search_list['St'] >= database['St'] <= search_list['End']] 

Но, очевидно, это очень грубо! Любые предложения будут приветствоваться.

Обновление Я пробовал предложение KobiK, похоже, что он должен работать. Но теперь мне трудно преобразовать значения, привязанные к клавишам «St» и «End», от строк до целых чисел, чтобы выполнить математический поиск.

Вот что у меня есть:

 matchedVars ={[record for record in database for lookup in search_list if record['Chr'] == lookup['Chr'] if int(lookup['St']) <= int(record['St']) <= int(lookup['End'])]} 

Но это порождает эту ошибку:

Файл «snp_freq_V1-4.py», строка 86, в

matchedVars = {[запись для записи в базу данных для поиска в search_list, если запись ['Chr'] == lookup ['Chr'], если int (lookup ['St']) <= int (запись ['St']) < = int (lookup ['End'])]}

TypeError: строковые индексы должны быть целыми числами

Есть ли лучший / более подходящий способ преобразования ключей из строк в ints?

2 Solutions collect form web for “Использование определения списка для соответствия значениям словарей, которые хранятся в списках”

Вы можете использовать понимание списка : этот код будет итерировать элементы в database dict и будет проверять критерии в search_list

 search_list =[{'Chr':'chr1','St':'2345','End':'2456'},{'Chr':'chr2','St':'3457','End':'4567'}] database = [{'Chr':'chr1','St':'2348','End':'2348'},{'Chr':'chr2','St':'190','End':'190'}] print [record for record in database for lookup in search_list if record['Chr'] == lookup['Chr'] if lookup['St'] <= record['St'] <= lookup['End']] 

Вывод:

 [{'Chr': 'chr1', 'End': '2348', 'St': '2348'}] 

Как вы можете видеть на выходе только {'Chr': 'chr1', 'End': '2348', 'St': '2348'} соответствует критериям внутри search_list

Это грубый код, но как насчет этого?

 matched = [] for d in search_list: for db in database: if d["Chr"] == db["Chr"]: if db["St"] >= d["St"] and db["St"] <= d["End"]: matched.append(db) print matched 

Надеюсь, это поможет

  • Как получить значение индекса для понимания списка?
  • Самый эффективный способ Python выбрать самую длинную строку в списке?
  • Расширение кортежей в генераторе понимания списка
  • Python, работающий со списком
  • Pythonic способ распечатать элементы списка
  • Удалите четное / нечетное число из нечетного / четного списка Python.
  • Понимание списка Python с уникальными элементами
  • Автоматическое упрощение / рефакторинг кода Python (например, для циклов -> понимание списка)?
  • Python - лучший язык программирования в мире.