2014-08-11 2 views
0

У меня есть список с элементами следующего вида:Поиск элемента в списке списков

[['37a1', 1], 153, 160, [[13, 2], [53, -1], [67, 2], [127, -1], [443, -1], [547, 2], [599, -1]]] 
[['57a1', 1], 155, 157, [[5, 2], [11, -1]]] 
[['198a1', 1], 156, 156, []] 
[['551c1', 1], 155, 158, [[5, 5], [43, -1], [149, -1]]] 

Как я могу искать элементы в списке, например, что [anything,-1] является частью моего элемента? В этом случае первые два и последние элементы должны возвращаться в качестве моего ответа.

Я знаю, как вытащить только один элемент в списке, который соответствует ['37a1',1], например:

matches = [x for x in regs if ['37a1', 1] in x]; matches 

Я предполагаю, что на основании этого, что я должен делать что-то очень похожее на выше, но с заменой ['37a1', 1] с каким-то указанием «ничего». В качестве другого примера, я хочу, чтобы иметь возможность искать [anything,5] внутри моего элемента и возвращать последний элемент в этом списке в качестве моего вывода.

+0

'В этом случае первые два элемент должен вернуться в моем answer' мне не ясен. У вас есть 4 списка в вашем примере или только один список? – perreal

+0

Это единственный список. Каждая строка является одним элементом. –

+0

@HaikalYeo: но ваши подсписки вложены; '[67, 2] в x' никогда не будет соответствовать, например, потому что этот подсписок находится внутри * другого * подписок. –

ответ

2

Я предполагаю, что вы хотели протестировать подсписок в последний элемент каждого списка, а не первые 3 элемента.

Вам нужно будет протестировать каждый элемент в каждом вложенном списке; используя any() бы сделать это немного более эффективным:

[x for x in regs if any(sub[1] == -1 for sub in x[-1])] 

Испытание any() не перебирает выражения генератора до значения True найден, после чего он перестает итерацию и возвращает True. Это означает, что x включен только в том случае, если в x[-1] есть подсписок, второй элемент которого равен -1.

+0

Хм. Я только получил [] как вывод для ввода кода. :/ Мог бы сказать что-нибудь о моем списке? –

+0

@HaikalYeo: ваши списки имеют дальнейшее гнездование, что усложняет ситуацию. Вы уверены, что ваша структура данных правильная? –

+0

Это результат выхода предыдущей функции. Если вы спрашиваете, правильное ли представление моих данных, да, это так. Элементы в моем списке имеют вид: [['label', integer], integer, integer, [[integer, integer], [integer, integer], ...]]. Вопрос был в том, что я могу путать строку с представлением, которое, честно говоря, не знаю, как рассказать обо всем здесь. –

2

Это должно работать с произвольными вложенными списками:

def has_items(m): 
    for x in m: 
     if isinstance(x, list): 
      if not isinstance(x[0], list): 
       if len(x) == 2 and x[1] == -1: return x 
      elif has_items(x): return x 
    return False 


print has_items(reversed(m)) 
+2

Вы избили меня до этого, и ваша версия стала чище, чем решение, которое у меня было. Upvoted. –

+0

Спасибо за решение! –

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