Фильтр в список 2-й степени

#python #python-3.x #list #arraylist

#python #python-3.x #Список #arraylist

Вопрос:

у меня есть list имя info , которое содержит несколько списков

структура info является : info=[[time, city, time, number]]

вот пример info :

 info = [
[0, 'alger', 'en stationnement', '1132'],
[1620, 'Place du 1er Mai', '0:27:00', '1002'],
[1800, 'Vieux Kouba', '0:30:00', '1134'],
[3420, 'garidi', '0:57:00', '1004'],
[3600, 'Vieux Kouba', '1:00:00', '1136'],
[5220, 'Place du 1er Mai', '1:27:00', '1006'],
[6000, 'alger', '1:40:00', '1132'],
[7620, 'Place du 1er Mai', '2:07:00', '1002'],
[7800, 'Vieux Kouba', '2:10:00', '1134'],
[9420, 'Hamma', '2:37:00', '1004'],
[9600, 'Vieux Kouba', '2:40:00', '1136'],
[11220, 'Hamma', '3:07:00', '1006'],
[12000, 'alger', '3:20:00', '1132'],
[13800, 'Vieux Kouba', '3:50:00', '1134'],
]
  

я хочу, чтобы список не содержал более 2 элементов каждого города.

как и для city alger, есть 3 элемента, список filtred должен содержать только первые 2 элемента

Комментарии:

1. Что вы пробовали до сих пор?

Ответ №1:

Это один из подходов, используемых collections.defaultdict для ведения подсчета

Пример:

 from collections import defaultdict

c = defaultdict(int)

result = []
for i in info:
    if c[i[1]] == 2:
        continue
    c[i[1]]  = 1
    result.append(i)
    
print(result)
  

Вывод:

 [[0, 'alger', 'en stationnement', '1132'],
 [1620, 'Place du 1er Mai', '0:27:00', '1002'],
 [1800, 'Vieux Kouba', '0:30:00', '1134'],
 [3420, 'garidi', '0:57:00', '1004'],
 [3600, 'Vieux Kouba', '1:00:00', '1136'],
 [5220, 'Place du 1er Mai', '1:27:00', '1006'],
 [6000, 'alger', '1:40:00', '1132'],
 [9420, 'Hamma', '2:37:00', '1004'],
 [11220, 'Hamma', '3:07:00', '1006']]
  

Ответ №2:

 info = [
[0, 'alger', 'en stationnement', '1132'],
[1620, 'Place du 1er Mai', '0:27:00', '1002'],
[1800, 'Vieux Kouba', '0:30:00', '1134'],
[3420, 'garidi', '0:57:00', '1004'],
[3600, 'Vieux Kouba', '1:00:00', '1136'],
[5220, 'Place du 1er Mai', '1:27:00', '1006'],
[6000, 'alger', '1:40:00', '1132'],
[7620, 'Place du 1er Mai', '2:07:00', '1002'],
[7800, 'Vieux Kouba', '2:10:00', '1134'],
[9420, 'Hamma', '2:37:00', '1004'],
[9600, 'Vieux Kouba', '2:40:00', '1136'],
[11220, 'Hamma', '3:07:00', '1006'],
[12000, 'alger', '3:20:00', '1132'],
[13800, 'Vieux Kouba', '3:50:00', '1134'],
]

tmp = {}
for item in info:
    tmp.setdefault(item[1], []).append(item)

out = []
for item in tmp.values():
    out.extend(item[:2])

from pprint import pprint
pprint(out)
  

С принтами:

 [[0, 'alger', 'en stationnement', '1132'],
 [6000, 'alger', '1:40:00', '1132'],
 [1620, 'Place du 1er Mai', '0:27:00', '1002'],
 [5220, 'Place du 1er Mai', '1:27:00', '1006'],
 [1800, 'Vieux Kouba', '0:30:00', '1134'],
 [3600, 'Vieux Kouba', '1:00:00', '1136'],
 [3420, 'garidi', '0:57:00', '1004'],
 [9420, 'Hamma', '2:37:00', '1004'],
 [11220, 'Hamma', '3:07:00', '1006']]
  

Ответ №3:

ниже

 from collections import defaultdict 
info = [
[0, 'alger', 'en stationnement', '1132'],
[1620, 'Place du 1er Mai', '0:27:00', '1002'],
[1800, 'Vieux Kouba', '0:30:00', '1134'],
[3420, 'garidi', '0:57:00', '1004'],
[3600, 'Vieux Kouba', '1:00:00', '1136'],
[5220, 'Place du 1er Mai', '1:27:00', '1006'],
[6000, 'alger', '1:40:00', '1132'],
[7620, 'Place du 1er Mai', '2:07:00', '1002'],
[7800, 'Vieux Kouba', '2:10:00', '1134'],
[9420, 'Hamma', '2:37:00', '1004'],
[9600, 'Vieux Kouba', '2:40:00', '1136'],
[11220, 'Hamma', '3:07:00', '1006'],
[12000, 'alger', '3:20:00', '1132'],
[13800, 'Vieux Kouba', '3:50:00', '1134'],
]
d = defaultdict(lambda :0)
new_info = []
for item in info:
  if d[item[1]] >= 2:
    continue
  else:
    d[item[1]]  = 1
    new_info.append(item)
for item in new_info: 
  print(item)
  

вывод

 [0, 'alger', 'en stationnement', '1132']
[1620, 'Place du 1er Mai', '0:27:00', '1002']
[1800, 'Vieux Kouba', '0:30:00', '1134']
[3420, 'garidi', '0:57:00', '1004']
[3600, 'Vieux Kouba', '1:00:00', '1136']
[5220, 'Place du 1er Mai', '1:27:00', '1006']
[6000, 'alger', '1:40:00', '1132']
[9420, 'Hamma', '2:37:00', '1004']
[11220, 'Hamma', '3:07:00', '1006']