Python 我在计算字母数字列表的总和

Python 我在计算字母数字列表的总和,python,regex,Python,Regex,这是原始列表: 我试图从中生成一个子列表,如下所示: ['AI077:077', 'AI077:077', 'AI077:077', 'AI077:077', 'AI567:567', 'AI567:567', 'BA896:896', 'SI267:267', 'SI267:267', 'SI267:267'] 我已经成功地生成了列表,现在我正在尝试根据**:之后的值计算排序列表**的总和,对于每个航班号 预期产出: 我的代码: 我的输出: 使用defaultdict会更容易,如果您坚持将输

这是原始列表:

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

['AI077:077', 'AI077:077', 'AI077:077', 'AI077:077', 'AI567:567', 'AI567:567', 'BA896:896', 'SI267:267', 'SI267:267', 'SI267:267']
我已经成功地生成了列表,现在我正在尝试根据**:之后的值计算排序列表**的总和,对于每个航班号

预期产出:

我的代码:

我的输出:

使用defaultdict会更容易,如果您坚持将输出作为列表,请稍后将其转换为:

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']
如果您使用的是Python,那么使用defaultdict会更容易,如果您坚持让输出作为列表,那么以后再转换它:

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

如果您使用的是Python如果您真的想汇总航班号,您可以直接从原始数据创建元组并将它们汇总成dict:使用defaultdict会更好

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) 
输出:

{'BA896': 896, 'SI267': 801, 'AI077': 308, 'AI567': 1134}
# sold tickets per flight
Counter({'AI077': 4, 'SI267': 3, 'AI567': 2, 'BA896': 1})
不过,我觉得有点奇怪的是,你似乎使用了航班名称中的航班号作为乘客计数-你不应该计算每个航班的售出机票吗

点票:

               #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)
输出:

{'BA896': 896, 'SI267': 801, 'AI077': 308, 'AI567': 1134}
# sold tickets per flight
Counter({'AI077': 4, 'SI267': 3, 'AI567': 2, 'BA896': 1})
您还可以使用排序列表对航班进行分组和评估,如下所示:

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

如果您真的想汇总航班号,您可以直接从原始数据创建元组并将它们汇总成dict:使用defaultdict会更好

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) 
输出:

{'BA896': 896, 'SI267': 801, 'AI077': 308, 'AI567': 1134}
# sold tickets per flight
Counter({'AI077': 4, 'SI267': 3, 'AI567': 2, 'BA896': 1})
不过,我觉得有点奇怪的是,你似乎使用了航班名称中的航班号作为乘客计数-你不应该计算每个航班的售出机票吗

点票:

               #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)
输出:

{'BA896': 896, 'SI267': 801, 'AI077': 308, 'AI567': 1134}
# sold tickets per flight
Counter({'AI077': 4, 'SI267': 3, 'AI567': 2, 'BA896': 1})
您还可以使用排序列表对航班进行分组和评估,如下所示:

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

看起来好像您正在将航班号相加,但我认为您可能希望将乘客总数相加,如下所示:

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])
因此,退票:


看起来好像您正在将航班号相加,但我认为您可能希望将乘客总数相加,如下所示:

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])
因此,退票:


谢谢你的回答。我喜欢在这里使用defaultdict。但当我试图将其转换回列表时,值消失了。关于如何在将其转换为列表时保留这些值,有什么建议吗?@Hackersinside我使用了您在问题中提供的数据。您使用了不同的输入,或者错误地复制粘贴了我答案中的代码。谢谢您的回答。我喜欢在这里使用defaultdict。但当我试图将其转换回列表时,值消失了。关于如何在将其转换为列表时保留这些值,有什么建议吗?@Hackersinside我使用了您在问题中提供的数据。您可能使用了不同的输入,或者错误地复制粘贴了我答案中的代码。谢谢,切片的想法看起来真的很酷。但是,这些值在转换为list@HackersInside什么价值观?航班上的号码?为什么要添加FlightNumber?非常感谢您的努力,我想这就是我想要的。谢谢,切片的想法看起来很酷。但是,这些值在转换为list@HackersInside什么价值观?航班上的号码?你为什么要添加航班号?非常感谢你的努力,我想这就是我想要的。