首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我试图计算字母数字列表的和

我试图计算字母数字列表的和
EN

Stack Overflow用户
提问于 2018-12-13 22:28:19
回答 3查看 169关注 0票数 1

,这是最初的列表:

代码语言:javascript
运行
复制
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"]

我试图从其中生成一个子列表,如下所示:

代码语言:javascript
运行
复制
['AI077:077', 'AI077:077', 'AI077:077', 'AI077:077', 'AI567:567', 'AI567:567', 'BA896:896', 'SI267:267', 'SI267:267', 'SI267:267']

我已经成功地生成了列表,现在我尝试根据**之后的值计算排序列表**的和:“每个flight_no的”

预期输出:

代码语言:javascript
运行
复制
[AI077:308, AI567:1134, BA896:896, SI267:801]

我的代码:

代码语言:javascript
运行
复制
def find_passengers_per_flight():
    flight_name=[]
    flight_passenger=[]
   """
    In the list, details should be provided in the format:
    [flight_no:no_of_passengers, flight_no:no_of_passengers, etc.]."""


    for t in ticket_list:
        res=''
        res = re.search(r"[A-Z]*\d*|[a-z]*\d*",t).group()

        flight_name.append(res)

    for i in flight_name:

        new_str=''
        res2 = re.search(r"\d+",i).group()
        new_str+=':'+res2
        flight_passenger.append(i+new_str)


    print(sorted(flight_passenger))

My输出:

代码语言:javascript
运行
复制
['AI077:077', 'AI077:077', 'AI077:077', 'AI077:077', 'AI567:567', 'AI567:567', 'BA896:896', 'SI267:267', 'SI267:267', 'SI267:267']
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-12-13 22:39:58

如果您真的想总结航班号码,可以直接从原始数据中创建元组,并将它们相加为dict:(使用defaultdict更好)

代码语言:javascript
运行
复制
t = ['AI077:077', 'AI077:077', 'AI077:077', 'AI077:077', 'AI567:567',
     'AI567:567', 'BA896:896', 'SI267:267', 'SI267:267', 'SI267:267']

trimmed = [(y[0:5],int(y[6:])) for y in t]

summs = {}
for flight,price in trimmed:
    summs.setdefault(flight,0)
    summs[flight] += price

print(summs) 

输出:

代码语言:javascript
运行
复制
{'BA896': 896, 'SI267': 801, 'AI077': 308, 'AI567': 1134}

我觉得有点奇怪的是,你好像用了航班名上的航班号作为乘客计数--你不应该计算每趟航班售出的机票吗?

点票:

代码语言:javascript
运行
复制
               #flight : from : to : seat-number
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"]

from collections import Counter
c = Counter ((t.split(":")[0] for t in ticket_list))

print(c)

输出:

代码语言:javascript
运行
复制
# sold tickets per flight
Counter({'AI077': 4, 'SI267': 3, 'AI567': 2, 'BA896': 1})

您还可以使用排序列表中的群从迭代工具对航班进行分组,并按如下方式对其进行评估:

代码语言:javascript
运行
复制
from itertools import groupby

# if you need the tickets as well:
grp = groupby(sorted(ticket_list), lambda x:x[:6])

for g in grp:
    key, seats = g
    seats = list(seats)
    print(f"Flight: {key} has sold seats {len(seats)}: {','.join( x.split(':')[-1] for x in seats)}")

Flight: AI077: has sold seats 4: 060,051,056,050
Flight: AI567: has sold seats 2: 015,014
Flight: BA896: has sold seats 1: 067
Flight: SI267: has sold seats 3: 148,145,146
票数 1
EN

Stack Overflow用户

发布于 2018-12-13 22:35:44

使用defaultdict会更容易,如果您坚持要将输出作为列表进行转换,那么稍后:

代码语言:javascript
运行
复制
from collections import defaultdict

l = ['AI077:077', 'AI077:077', 'AI077:077', 'AI077:077', 'AI567:567', 'AI567:567', 'BA896:896', 'SI267:267', 'SI267:267', 'SI267:267']
d = defaultdict(int)

for e in l:
    name, number = e.split(':')
    number = int(number)
    d[name] += number

print(d)
#  defaultdict(<class 'int'>, {'AI077': 308, 'AI567': 1134, 'BA896': 896, 'SI267': 801})
print(['{}:{}'.format(k, v) for k, v in d.items()])
#  ['AI077:308', 'AI567:1134', 'BA896:896', 'SI267:801']

如果您使用的是Python3.6Python3.6时,不能保证输出将始终保持相同的顺序,而且我假设这并不重要。

票数 2
EN

Stack Overflow用户

发布于 2018-12-13 22:56:15

似乎你把航班号码加在一起,但我认为你会想把乘客总数加在一起,如下所示:

代码语言:javascript
运行
复制
import re

tickets = {}
for i in ticket_list:
    data = re.findall(r'(^[A-Z]+[0-9]+).*?([0-9]+$)', i)[0]
    if data[0] in tickets.keys():
        tickets[data[0]] += int(data[1])
    else:
        tickets[data[0]] = int(data[1])

因此,tickets返回:

代码语言:javascript
运行
复制
{'AI567': 29, 'AI077': 217, 'BA896': 67, 'SI267': 439}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53770975

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档