2015-02-26 2 views
0

У меня есть функция, которая создает список аминокислот (aaCandidates), но этот список может даже быть пустым. Если этот список пуст, я хотел бы перейти к шагу и продолжить его.Как обрабатывать пустой список, python3

Мой код:

def magicfunction(referenceDistance,referenceAA): 

    amminoacids = ('A', 'R', 'N', 'D', 'C', 'Q', 'E', 'G', 'H', 'I', 'L', 'K', 'M', 'F', 'P', 'S', 'T', 'W', 'Y', 'V') 
    aaCandidates = list() 
    for aa in amminoacids: 
     if distance(aa,referenceAA) == referenceDistance: 
      aaCandidates.append(aa) 
     if not aaCandidates: 
      break 

    luckyAA = choice(aaCandidates) 

    return(luckyAA) 

Я называю эту функцию в другом файле, как следующие:

for i in range(lenghtPairs): 
    r1 = randrange(20) 
    r2 = randrange(20) 
    coppie.append([aminoacidi[r1], aminoacidi[r2]]) 

for i in range(lenghtPairs): 
    dictionary = dict() 
    frequenze = dict() 

    if i == 0: 
     a = randrange(20) 
     b = randrange(20) 
     pairs[0] = [aminoacids[a], aminoacids[b]] 
    else: 
     c = randrange(20) 
     pairs[i][0] = aminoacids[c] 
     distanceNeighbours = distance(pairs[i][0],pairs[i-1][0]) 
     aaChosen = magicfunction(distanceNeighbours,pairs[i-1][1]) 
     pairs[i][1] = aaChosen 

    print(i + 1) 

Я попробовал условие =>if not aaCandidates: break, но это не сработало:

 File "/.../lib/python3.4/random.py", line 255, in choice 
    raise IndexError('Cannot choose from an empty sequence') 
IndexError: Cannot choose from an empty sequence 
+0

Define * не работает * более близко. Вы имеете в виду, что вызов 'random.choice()' вызывает исключение? –

+2

Обратите внимание, что гораздо чаще (и естественно) использовать '[]' для определения пустого списка и '{}' для пустого словаря, а не 'list()' и 'dict()'. –

+0

если "len (aaCandidates) == 0"? –

ответ

1

Ваш список пуст, поэтому random.choice() не удается. Вы должны решить, что делать вместо когда список пуст, но сделать это вне петли for, поэтому, когда список завершил строительство:

for aa in amminoacids: 
    if distance(aa,referenceAA) == referenceDistance: 
     aaCandidates.append(aa) 

if not aaCandidates: 
    return 'some default choice' 

luckyAA = choice(aaCandidates) 
return luckyAA 

Все, что положить ваши break в цикл достигается, чтобы гарантировать, что ничего не будет добавлено в ваш список, если первый aa не был кандидатом.

+0

большое спасибо! – rory

+0

Или: 'return heapq.nlargest (1, (aa для aa в amminoacids, если расстояние (aa, referenceAA) == referenceDistance), key = lambda L: random.random()) или 'default')'? –

+0

@JonClements: yay, позволяет найти еще несколько ультра-продвинутых однострочных! :-П –

Смежные вопросы