Python - 列表映射
我有几个列表想要组合在一起,但我有点搞不清楚该怎么做。
我正在抓取实时的赛马结果数据。这个数据源只会列出赛道和时间一次,然后是三匹马及其名次(前面三名),或者如果比赛被取消了,就会列出四匹马和空白的位置(也就是"")。这些就是我拥有的列表:
course, time, abandoned, horses, position
这些列表的顺序是一样的。
course
、time
和abandoned
都有完全相同的元素数量(abandoned是一个布尔值列表,True表示比赛被取消了)。
horses
是一个包含(非取消比赛数量 * 3)+(取消比赛数量 * 4)匹马的列表。
position
是一个包含马匹名次的列表。如果比赛被取消,位置会是"",否则会是"1"、"2"、"3"(都是字符串!)。
示例列表:
没有比赛被取消的情况
course = ["Course A", "Course A", "Course B"] #there were two races at course A
times = ["00:00", "01:00", "15:00"] #Race 1 at Course A was at 00:00, race 2 at course A was at 01:00
horses = ["HorseA 1", "HorseA 2", "HorseA 3", "HorseA 4", "HorseA 5", "HorseA 6", "HorseB 1", "HorseB 2", "HorseB 3"] #There are three horses per race
positions = ["1","2","3","1","2","3","1","2","3"]
所以,在A赛道的00:00比赛中,"HorseA 1"获得了第一名,"HorseA 2"获得了第二名,"HorseA 3"获得了第三名。
有比赛被取消的情况
courses = ["CourseX", "CourseX", "CourseY"]
times = ["01:00", "02:00", "01:00"]
abandoned = [False, False, True]
horses = ["X1", "X2", "X3", "X4", "X5", "X6", "Y1", "Y2", "Y3", "Y4"]
positions = ["1","2","3","1","2","3","","","",""]
所以,在X赛道有两场比赛,但Y赛道的比赛被取消了。
我想得到的是一个像这样的元组列表:
[(A Race Course, 00:00, False, Horsey, 1), (A Race Course, 00:00, False, Horsey 2, 2) ... ]
我不太确定该怎么做,有什么建议吗?
谢谢,
皮特
3 个回答
def expand(abandoned,seq):
for was_abandoned,elt in zip(abandoned,seq):
if was_abandoned:
for _ in range(4): yield elt
else:
for _ in range(3): yield elt
course=['A Race Course','B Race Course']
time=['00:00','01:00']
abandoned=[False,True]
horses=['Horsey-{0}'.format(n) for n in range(8)]
position=['1','2','3','','','','']
result=[(c,t,a,h,p) for (c,t,a),h,p in
zip(expand(abandoned,zip(course,time,abandoned)),horses,position)]
print(result)
这个内容展示了一些数据,具体来说是关于赛马的信息。每一条信息都包含了几个部分,分别是赛道名称、时间、是否开始、马匹名称和一个编号。
这里的例子有:
- 第一条:在“A Race Course”这个赛道上,时间是“00:00”,还没开始,马匹是“Horsey-0”,编号是“1”。
- 第二条:同样在“A Race Course”,时间也是“00:00”,还没开始,马匹是“Horsey-1”,编号是“2”。
- 第三条:依然在“A Race Course”,时间还是“00:00”,还没开始,马匹是“Horsey-2”,编号是“3”。
- 接下来是“B Race Course”,时间是“01:00”,已经开始,马匹是“Horsey-3”,编号是空的。
- 还有一条在“B Race Course”,时间是“01:00”,已经开始,马匹是“Horsey-4”,编号也是空的。
- 再来一条在“B Race Course”,时间是“01:00”,已经开始,马匹是“Horsey-5”,编号同样是空的。
- 最后一条在“B Race Course”,时间是“01:00”,已经开始,马匹是“Horsey-6”,编号也是空的。
你想用zip()
函数来实现这个功能。
不过我需要更多关于horses
的信息,才能给你一个具体的例子。比如说,它是不是像这样[H1, h2, h3, "", h5, h6, h7, h8, h9, h10, ""]
?
为了让你入门,你需要把长度相同的项目进行配对,也就是用zip函数来处理:
races = zip(course, time, abandoned)
然后(根据你不太清楚的horses结构),你可能需要用列表推导式把每个马的结果和一个比赛项目连接起来。你可以先把horses列表分成一个horses_in_race
列表,然后再用这个列表和zip函数配合使用,可能会更简单。
如果问题描述得更完整一些,我就能给出更好的答案了。
在编程中,有时候我们需要把一些数据从一个地方传到另一个地方。这就像把水从一个杯子倒到另一个杯子一样。为了做到这一点,我们通常会用到一些工具或者方法。
有些时候,我们可能会遇到一些问题,比如数据没有正确地传输,或者传输的速度很慢。这就像你在倒水的时候,发现水流得很慢,或者有些水洒了出来。
为了避免这些问题,我们可以使用一些技巧,比如选择合适的容器,或者调整倒水的角度。同样,在编程中,我们也可以通过优化代码或者选择更好的算法来提高数据传输的效率。
总之,数据传输是编程中一个很重要的部分,理解它的基本原理可以帮助我们写出更好的代码。
>>> class s:
courses = ["CourseX", "CourseX", "CourseY"]
times = ["01:00", "02:00", "01:00"]
abandoned = [False, False, True]
horses = ["X1", "X2", "X3", "X4", "X5", "X6", "Y1", "Y2", "Y3", "Y4"]
positions = ["1","2","3","1","2","3","","","",""]
>>> def races(courses, times, abandoned, horses, positions):
z = zip(horses, positions)
for course, time, stopped in zip(courses, times, abandoned):
for _ in range(4 if stopped else 3):
horse, pos = next(z)
yield course, time, stopped, horse, pos
>>> print(*races(s.courses, s.times, s.abandoned, s.horses, s.positions), sep='\n')
('CourseX', '01:00', False, 'X1', '1')
('CourseX', '01:00', False, 'X2', '2')
('CourseX', '01:00', False, 'X3', '3')
('CourseX', '02:00', False, 'X4', '1')
('CourseX', '02:00', False, 'X5', '2')
('CourseX', '02:00', False, 'X6', '3')
('CourseY', '01:00', True, 'Y1', '')
('CourseY', '01:00', True, 'Y2', '')
('CourseY', '01:00', True, 'Y3', '')
('CourseY', '01:00', True, 'Y4', '')