2017-01-25 3 views
-2

У меня есть список, содержащий кортежи. Я хочу выполнить поиск по этому списку, проверив все первые элементы кортежей. Если у меня есть только один результат, я хочу вернуть список с индексом 0 результата поиска. Если результаты> 1, я хочу вернуть список с индексом 1 результатов поиска.сгенерировать список в зависимости от длины списка

Я пытался сделать это с помощью генераторов, но не смог. Я теперь придумал следующее, но я чувствую, что это может быть лучше. Кто-нибудь предлагает?

a = [("ab", 2), ("ac", 3), ("bd", 3)] 

def returner(keyword): 
    def firstitem(_a): 
     list1.append(_a[0]) 
     list2.append(_a[1]) 

    def otheritems(_a): 
     list2.append(_a[1]) 

    list1 = [] 
    list2 = [] 
    append = firstitem 
    for _a in a: 
     if _a[0].startswith(keyword): 
      append(_a) 
      append = otheritems 
    return list2 if len(list2) > 1 else list1 

returner("a") приведет [2,3] (индекс 0 из обоих кортежей, начиная с одной)

returner("b") привело бы к ["bd"] (индекс 1 из кортежа 3 как длина результата только один)

+4

Можете ли вы предоставить пример ввода и желаемого выхода? мне непонятно, чего вы пытаетесь достичь. Что такое результат? –

ответ

0

не в состоянии чтобы выяснить причину такой специфической функции, но более простой эквивалент:

def returner2(keyword): 
    rv=[] 
    first_match=None 
    for _a in a: 
     if _a[0].startswith(keyword): 
      if first_match is None: 
       first_match=_a[0] 
      rv.append(_a[1]) 

    if len(rv)==1: 
     return [first_match] 
    else: 
     return rv 
+0

Thanks.Edited мое оригинальное сообщение с примерами вывода. Ваш эквивалент не эквивалентен. – sanders

+0

извините, но я не вижу, как он отличается. Эта функция возвращает те же результаты для входов, которые вы предоставили в своем сообщении. – Bitonator

+0

Хорошо. Изменен мой код. Сейчас он ближе к тому, что я намереваюсь сделать. – sanders

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