Python, работающий со списком

У меня такой код:

a = [[1, 1], [2, 1], [3, 0]] 

Я хочу получить два списка, первый содержит элементы 'a' , где a[][1] = 1 , а второй – элементы, где a[][1] = 0 . Так

 first_list = [[1, 1], [2, 1]] second_list = [[3, 0]]. 

Я могу сделать это с учетом двух списков:

 first_list = [i for i in a if i[1] == 1] second_list = [i for i in a if i[1] == 0] 

Но может быть, существует другой (более пифонический или более короткий) способ сделать это? Спасибо за ваши ответы.

6 Solutions collect form web for “Python, работающий со списком”

Понимание списка очень питоновское и рекомендуемый способ сделать это. Ваш код в порядке.

Если вы хотите иметь его в одной строке, вы можете сделать что-то вроде

 first_list, second_list = [i for i in a if i[1] == 1], [i for i in a if i[1] == 0] 

Помните, что «Явное лучше, чем неявное».

Ваш код в порядке

Вы можете использовать itertools.groupby() sorted() и itertools.groupby() для этого, но я не знаю, что это будет квалифицироваться как Pythonic per se:

 >>> dict((k, list(v)) for (k, v) in itertools.groupby(sorted(a, key=operator.itemgetter(1)), operator.itemgetter(1))) {0: [[3, 0]], 1: [[1, 1], [2, 1]]} 

как насчет этого,

 In [1]: a = [[1, 1], [2, 1], [3, 0]] In [2]: first_list = [] In [3]: second_list = [] In [4]: [first_list.append(i) if i[1] == 1 else second_list.append(i) for i in a] Out[4]: [None, None, None] In [5]: first_list, second_list Out[5]: ([[1, 1], [2, 1]], [[3, 0]]) 

вместо двух подписок, я предпочитаю dict (или defaultdict, OrderedDict, Counter и т. д.),

 In [6]: from collections import defaultdict In [7]: d = defaultdict(list) In [8]: [d[i[1]].append(i) for i in a] Out[8]: [None, None, None] In [9]: d Out[9]: {0: [[3, 0]], 1: [[1, 1], [2, 1]]} 

Если списки являются достаточно короткими, тогда два понимания списка будут хорошо: вы не должны беспокоиться о производительности, пока ваш код не будет работать, и вы знаете, что он слишком медленный.

Если ваши списки длинны или код работает часто, и вы продемонстрировали, что это узкое место, вам нужно только перейти от контекста списка к циклу for:

 first_list, second_list = [], [] for element in a: if element[1] == 1: first_list.append(element) else: second_list.append(element) 

который является ясным и легко распространяется на большее число случаев.

список замечаний велик. Если вы хотите немного более простой код (но немного дольше), просто используйте цикл for.

Еще одним вариантом были бы фильтры и карты:

 a = [[1, 1], [2, 1], [3, 0]] g1=filter(lambda i: i[1]==1,a) g1=map(lambda i: i[0],g1) g2=filter(lambda i: i[1]==0,a) g2=map(lambda i: i[0],g2) print g1 print g2 
  • Как получить значение индекса для понимания списка?
  • Понятия в Python к выборке кортежей из списка
  • Python - поиск инкрементных нумерованных последовательностей с пониманием списка
  • Python: найдите последовательное изменение в одном члене пар списка, сообщите другое
  • Транспонирование матрицы в Python
  • Самый быстрый способ преобразования итератора в список
  • Автоматическое упрощение / рефакторинг кода Python (например, для циклов -> понимание списка)?
  • Попытка понимания списка Python с двумя переменными разных диапазонов
  • Python - лучший язык программирования в мире.