разбивать список по условию в python

к настоящему времени я не нашел удобный способ разбить список на определенные условия, например, у меня есть список записей:

a = ((0,1),(1,0),(0,2),(1,0),(3,0),(4,0),(0,3),(1,5)....) 

я хочу разделить содержимое на 2 списка

 alist = [] blist = [] for x in a: if x[0] == 0: alist.append(x) elif x[0] == 1: blist.append(x) 

не очень лаконичный

писать в списках

 aList = [x for x in a if x[0] == 0] bList = [x for x in a if x[0] == 1] 

как правило, хороши для чтения и производительности, но в этом случае список должен повторяться в два раза.

есть ли лучший способ сделать эту работу?

  • Как распечатать на принтере ОС по умолчанию на Python 3 (кросс-платформу)?
  • Связь между строковым модулем и str
  • Force python не выводить float в стандартной форме / научная нотация / экспоненциальная форма
  • Python 2.x gotchas и наземные мины
  • Есть ли у python методы, подобные __setattr__, но для класса python?
  • Собирать все модули Python, используемые в одной папке?
  • В Python, учитывая URL-адрес текстового файла, какой самый простой способ прочитать содержимое текстового файла?
  • Это правильный способ импорта скриптов python, находящихся в произвольных папках?
  • 4 Solutions collect form web for “разбивать список по условию в python”

    Добавление одной строки сделает цикл более кратким по стоимости удобочитаемости (и FPness).

     alist = [] blist = [] bothlists = [alist, blist] for x in a: bothlists[x[0]].append(x) 

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

     aList, bList = [[x for x in a if x[0] == i] for i in (0, 1)] 

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

     from operator import itemgetter from collections import defaultdict d = defaultdict(list) for key, value in itertools.groupby(a, itemgetter(0)): d[key].append(list(value)) 

    Вот результат:

     >>> print d[0] [[(0, 1)], [(0, 2)], [(0, 3)]] >>> print d[1] [[(1, 0)], [(1, 0)], [(1, 5)]] >>> print d[4] [[(4, 0)]] 

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

    Я бы использовал filter , смотри: http://docs.python.org/2/library/functions.html#filter

     >>> a = ((0,1), (1,0), (0,2), (1,0), (3,0), (4,0), (0,3), (1,5)) >>> filter(lambda x: x[0] == 1, a) ((1, 0), (1, 0), (1, 5)) 

    Чтобы избежать избыточного кода, вы могли бы собирать условия в итерабеле, например:

     >>> fs = (lambda x: x[0] == 0, lambda x: x[0] == 1) >>> for f in fs: ... filter(f, a) ... ((0, 1), (0, 2), (0, 3)) ((1, 0), (1, 0), (1, 5)) 
    Python - лучший язык программирования в мире.