2016-11-08 4 views
4

У меня есть список списков кортежей:Фильтр список списков кортежей

oldList = [[(1,None),(2,45),(3,67)],[(1,None), (2,None), (3,None),(4,56),(5,78)],[(1, None),(2, 98)]] 

Я хотел бы, чтобы фильтровать любой экземпляр «None»:

newList = [[(2,45),(3,67)], [(4,56),(5,78)], [(2, 98)]] 

Ближайшим Я приходят с этой петли, но он не падает весь кортеж (только «None»), и он также разрушает список списков структуры кортежей:

newList = [] 
for data in oldList: 
    for point in data: 
     newList.append(filter(None,point)) 

ответ

7

Самый короткий способ сделать это с вложенным списком понимания:

>>> newList = [[t for t in l if None not in t] for l in oldList] 
>>> newList 
[[(2, 45), (3, 67)], [(4, 56), (5, 78)], [(2, 98)]] 

Вам нужно вставить два списка, потому что вы имеете дело со списком списков. Внешняя часть понимания списка [[...] for l in oldList] позаботится об итерировании через внешний список для каждого внутреннего списка. Затем во внутреннем понимании списка у вас есть [t for t in l if None not in t], что довольно простой способ сказать, что вам нужен каждый кортеж в списке, который не содержит None.

(Возможно, вы должны выбрать лучшие имена, чем l и t, но это будет зависеть от вашей предметной области. Я выбрал имена односимвольных, чтобы лучше выделить структуру коды.)

Если вы не знакомы или неудобно списковых, это логически эквивалентно следующему:

>>> newList = [] 
>>> for l in oldList: 
...  temp = [] 
...  for t in l: 
...   if None not in t: 
...    temp.append(t) 
...  newList.append(temp) 
... 
>>> newList 
[[(2, 45), (3, 67)], [(4, 56), (5, 78)], [(2, 98)]] 
1

Вы урожденная d создать временный список список в вас первый for петли для поддержания вложенную структуру списка, как:

>>> new_list = [] 
>>> for sub_list in oldList: 
...  temp_list = [] 
...  for item in sub_list: 
...   if item[1] is not None: 
...    temp_list.append(item) 
...  new_list.append(temp_list) 
... 
>>> new_list 
[[(2, 45), (3, 67)], [(4, 56), (5, 78)], [(2, 98)]] 

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

>>> oldList = [[(1,None),(2,45),(3,67)],[(1,None), (2,None), (3,None),(4,56),(5,78)],[(1, None),(2, 98)]] 
>>> [[(k, v) for k, v in sub_list if v is not None ] for sub_list in oldList] 
[[(2, 45), (3, 67)], [(4, 56), (5, 78)], [(2, 98)]] 
0

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

oldList = [[(1,None),(2,45),(3,67)],[(1,None), (2,None), (3,None),(4,56),(5,78)],[(1, None),(2, 98)]] 

newList = [] 
for data in oldList: 
    tempList = [] 
    for point in data: 
     if point[1]: 
      tempList.append(point) 
    newList.append(tempList) 

print newList 
>>> [[(2, 45), (3, 67)], [(4, 56), (5, 78)], [(2, 98)]] 
+0

Это разрушает структуру я пытаюсь сохранить. – mk8efz

+0

@ mk8efz обновил мой ответ. Взгляните –

0

Tuple неизменен, поэтому вы не можете изменить их. Вы должны их заменить. До сих пор наиболее канонический способ сделать это, чтобы использовать список понимания языка Python:

>>> oldList = [[(1,None),(2,45),(3,67)],[(1,None), (2,None), (3,None),(4,56),(5,78)],[(1, None),(2, 98)]] 
>>> [[tup for tup in sublist if not None in tup] for sublist in oldList] 
[[(2, 45), (3, 67)], [(4, 56), (5, 78)], [(2, 98)]] 
>>> 
0

списковых:

>>> newList = [[x for x in lst if None not in x] for lst in oldList] 
>>> newList 
[[(2, 45), (3, 67)], [(4, 56), (5, 78)], [(2, 98)]] 
>>> 
+0

. Вы подражаете;) –

+0

Hahah, я только что видел, есть другие комментарии xD –

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