2013-07-11 4 views
4

Название вопроса в значительной степени то, что мне интересно!Ссылаясь на первый элемент всех кортежей в списке кортежей

Скажем, у меня есть список кортежей:

tuple_list = [(1,'a'),(2,'b'),(3,'c')] 

Что бы использовать для обозначения всех первых элементов tuple_list? То, что я хотел бы вернуть, - это список первых элементов. Точно так же, как tuple_list.keys() будет работать, если бы это был словарь. Например:

(tuple_list expression here) = [1,2,3] 

Возможно ли это? Есть ли простое выражение или мне нужно будет проходить через tuple_list и создать отдельный список первых элементов таким образом?

Кроме того, причина, я хочу сделать это, потому что я хочу сделать следующее:

first_list = [(1,'a'),(2,'b'),(3,'c')] 
second_list = [1,2,3,4,4,5] 

third_list = set(second_list) - set(first_list(**first elements expression**)) = [4,5] 

Я адаптируя это для списков из какого-то старого кода, который использует словари:

first_dict = {1:'a',2:'b',3:'c'} 
second = [1,2,3,4,4,5] 

third_dict = set(second) - set(first_dict.keys()) = [4,5] 

Поэтому моя дилемма с отсутствием .key() для списков

Как всегда, пожалуйста, комментарий, если я могу улучшить/прояснить этот вопрос в любом случае.

Спасибо,

Alex

ответ

2

Да, это возможно.

Используйте список понимание:

>>> tuple_list = [(1,'a'),(2,'b'),(3,'c')] 
>>> [x[0] for x in tuple_list] 
[1, 2, 3] 

или:

>>> from operator import itemgetter 
>>> f = itemgetter(0) 
>>> map(f, tuple_list) 
[1, 2, 3] 

Ваш пример:

>>> first_list = [(1,'a'),(2,'b'),(3,'c')] 
>>> second_list = [1,2,3,4,4,5] 
>>> set(second_list) - set(x[0] for x in first_list) 
set([4, 5]) 
>>> set(second_list) - set(map(f, first_list)) 
set([4, 5]) 

или Как было предложено @JonClements, это будет быстрее:

>>> set(second_list).difference(map(f, first_list)) 
set([4, 5]) 

Обратите внимание, что если вы делаете это несколько раз, то вы можете конвертировать first_list в dict:

>>> dic = dict(first_list) 
>>> set(second_list).difference(dic) 
set([4, 5]) 
+0

элегантное решение, хотя я думаю, не многие помнят его, когда на самом деле нужно сделать что-то вроде этого – ilyail3

+0

Я редактировал вопрос, так что вы можете подтвердить, что в приложении поставленное выше я мог бы сделать: 'F = itemgetter (0) '' third_list = set (second_list) - set (map (f, first_list)) = [4,5] '?? – user1083734

+0

@ user1083734 оба они работают нормально. –

2

Вы можете попробовать этот список понимание:

tuple_list = [(1,'a'),(2,'b'),(3,'c')] 
desired_list = [ x for x, _ in tuple_list ] 

Вы можете также использовать map:

desired_list = map(lambda(x,_):x, tuple_list) 

Основываясь на ваших изменениях, вы можете сделать это:

>>> first_list = [(1,'a'),(2,'b'),(3,'c')] 
>>> second_list = [1,2,3,4,4,5] 
>>> third_list = set(second_list).difference(x for x, _ in first_list) 
>>> third_list 
set([4, 5]) 
Смежные вопросы