Как поместить вложенные циклы if и for в одну строку в python - PullRequest
0 голосов
/ 05 апреля 2019

Как я могу поместить следующее в одну строку для оператора if?

for g_id in gene_ids:
    # start one liner from here onward
   if g_id in actual_isoforms:
      pairs = [tup for tup in actual_isoforms[g_id]]
      for p in pairs:
          if p == (t_id, str(num)):
              iso_id = p[0]
              iso_num = p[1]
              total = check_exon_num[iso_id]

Я пробовал это, но там говорится, что 'tup' не определено:

if (g_id in actual_isoforms) and [p == (t_id, str(num)) for p in tup for tup in actual_isoforms[g_id]]:

Также actual_isoforms - это словарь со списком кортежей.Поэтому «пары» - это значения списка, а p - это каждый кортеж в этом списке.

Ответы [ 2 ]

0 голосов
/ 05 апреля 2019
pairs = [tup for tup in actual_isoforms[g_id] if tup == (t_id, str(num))]

Таким образом, вы можете иметь регулярное понимание списка с добавлением к нему if condition_expression.Таким образом, вы получаете [x for x in iterable if condition_expression], где condition_expression решает, должен ли элемент быть включен в результирующий список.

0 голосов
/ 05 апреля 2019

При условии, что у вашего ### STUFF нет назначений:

if g_id in actual_isoforms:
    result = [### STUFF for tup in actual_isoforms[g_id] if tup == (t_id, str(num))]

Вот где все пошло не так при попытке понять список:

 for p in tup for tup in actual_isoforms[g_id]

p и tup в вашем расширенном цикле относятся к той же вещи . Насколько я вижу, есть только одна петля.

...