Как объединить один элемент (состоящий из двух значений) в список с разделителем ":" в Python? - PullRequest
0 голосов
/ 19 апреля 2020

У меня есть список, приведенный ниже:

 ticket_list=["AI567:MUM:LON:014","AI077:MUM:LON:056", "BA896:MUM:LON:067", "SI267:MUM:SIN:145","AI077:MUM:CAN:060","SI267:BLR:MUM:148","AI567:CHE:SIN:015","AI077:MUM:SIN:050","AI077:MUM:LON:051","SI267:MUM:SIN:146"]

Мне нужно найти количество пассажиров на рейс, но я не могу присоединиться к счетчику и элементу с : в финалисте. Я дал функцию ниже и комментарии для описания и выходного формата.

 def find_passengers_per_flight():
'''Write the logic to find and return a list having number of passengers traveling per flight based on the details in the ticket_list
In the list, details should be provided in the format:
[flight_no:no_of_passengers, flight_no:no_of_passengers, etc.].'''
listairline=[]
count=0
finallist=[]
for i in ticket_list:
    # listairline=[]
    list2=i.split(":")
    listairline.append(list2[0])
for elem in listairline:
    count=listairline.count(elem)
    if elem not in finallist:
        finallist.append(elem,":",count) #here it is the line which needs to be modified. Kindly help
print (finallist)    

Ответы [ 3 ]

0 голосов
/ 19 апреля 2020

Используйте collections.defaultdict для подсчета билетов на рейс:

from collections import defaultdict

ticket_list=["AI567:MUM:LON:014","AI077:MUM:LON:056", "BA896:MUM:LON:067", "SI267:MUM:SIN:145","AI077:MUM:CAN:060","SI267:BLR:MUM:148","AI567:CHE:SIN:015","AI077:MUM:SIN:050","AI077:MUM:LON:051","SI267:MUM:SIN:146"]

flight_ticket_counts = defaultdict(int)
for ticket in ticket_list:
    flight_no, *_ = ticket.split(":")
    flight_ticket_counts[flight_no] += 1

print([f"{k}:{v}" for k, v in flight_ticket_counts.items()])
# ['AI567:2', 'AI077:4', 'BA896:1', 'SI267:3']

или в качестве однострочного, используя collections.Counter:

from collections import Counter

flight_ticket_counts = Counter(ticket.split(":")[0] for ticket in ticket_list)

print([f"{k}:{v}" for k, v in flight_ticket_counts.items()])
# ['AI567:2', 'AI077:4', 'BA896:1', 'SI267:3']

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

flight_passenger_counts = defaultdict(int)
for flight in ticket_list:
    flight_no, _, _, no_passengers = flight.split(":")
    flight_passenger_counts[flight_no] += int(no_passengers)

print([f"{k}:{v}" for k, v in flight_passenger_counts.items()])
# ['AI567:29', 'AI077:217', 'BA896:67', 'SI267:439']
0 голосов
/ 19 апреля 2020

Позволяет сделать это с помощью одной строки:

ticket_list=["AI567:MUM:LON:014","AI077:MUM:LON:056", "BA896:MUM:LON:067", "SI267:MUM:SIN:145","AI077:MUM:CAN:060","SI267:BLR:MUM:148","AI567:CHE:SIN:015","AI077:MUM:SIN:050","AI077:MUM:LON:051","SI267:MUM:SIN:146"]

[i+':'+str([i.split(':')[0] for i in ticket_list].count(i.split(':')[0])) for i in sorted(set([i.split(':')[0] for i in ticket_list])) ]

Или более простым способом:

res = [i.split(':')[0] for i in ticket_list]
res = [i+':'+str(res.count(i.split(':')[0])) for i in sorted(set(res)) ]

Или более быстрым способом:

from collections import Counter
res = Counter([i.split(':')[0] for i in ticket_list])
[i+':'+str(res[i]) for i in res]

Все вышеперечисленное дает:

['AI567:2', 'AI077:4', 'BA896:1', 'SI267:3']
0 голосов
/ 19 апреля 2020

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

finallist.append(elem + ":" + str(count))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...