【问题标题】:How to join a single element (consisting of two values) in a list with a seperator ":" in Python?如何在 Python 中使用分隔符“:”连接列表中的单个元素(由两个值组成)?
【发布时间】:2020-08-01 17:58:09
【问题描述】:

我有一个清单如下:

 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"]

我必须找到每个航班的乘客人数,但我无法将 : 加入计数和 elem 入围名单。我给出了下面的函数,cmets 用于描述和输出格式。

 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)    

【问题讨论】:

    标签: python python-3.x list function


    【解决方案1】:

    使用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']
    

    【讨论】:

      【解决方案2】:

      在我看来,问题似乎是要求您将答案转换为字符串,以获得与输入相同的格式。 您只需将行更改为:

      finallist.append(elem + ":" + str(count))
      

      【讨论】:

      • 如果您帮助删除决赛名单中的重复元素,您的代码可能是正确的,因为代码也显示重复元素
      • 这不是操作要求的。他只是想知道如何以正确的格式将他的答案插入到列表中。
      【解决方案3】:

      让我们用单线做到这一点:

      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']
      

      【讨论】:

      • 这是一个非常低效的单行。您在一次迭代中进行了三次拆分 + 在循环中使用 count 是额外的开销。
      • 我也发现以这种方式编写代码非常不利于可读性。
      • 在列表理解中使用 count 绝不是一个好主意。对于较大的列表,这将非常低效
      猜你喜欢
      • 1970-01-01
      • 2020-08-22
      • 2013-11-02
      • 2022-06-17
      • 1970-01-01
      • 1970-01-01
      • 2011-10-15
      • 1970-01-01
      相关资源
      最近更新 更多