python中的元组和列表排列
因此,这四个“团队”完成了“目标”的总数:python中的元组和列表排列,python,Python,因此,这四个“团队”完成了“目标”的总数: teams = ['W', 'X', 'Y', 'Z'] goals = [4, 5, 1, 9] 现在,如何知道哪个队完成了以下目标 given_goals = [3, 2, 7, 15] 预期答案应采用以下形式: answers = [('W', (2, 3)), ('X', 7), ('Z', 15)] W连续4个进球,因此第2个和第3个进球是他们的。 然后X在W之后连续进了5个球(5-10个),
teams = ['W', 'X', 'Y', 'Z']
goals = [4, 5, 1, 9]
现在,如何知道哪个队完成了以下目标
given_goals = [3, 2, 7, 15]
预期答案应采用以下形式:
answers = [('W', (2, 3)),
('X', 7),
('Z', 15)]
W
连续4个进球,因此第2个和第3个进球是他们的。
然后X
在W
之后连续进了5个球(5-10个),所以第7个球是他们的,依此类推
我试过了,但似乎很难:
teams_ = [team for team, goal in zip(teams, goals) for g in range(goal)]
teams_goals = [teams_[g-1] for g in given_goals]
print teams_goals
有更简单的方法吗?我认为这是最有效的方法:
import bisect
import itertools
teams = ['W', 'X', 'Y', 'Z']
goals = [4, 5, 1, 9]
# Create the max goal of each team
goal_ranges = itertools.accumulate(goals)
# Create sorted tuples of goals and teams (comes sorted because of accumulate)
ordered_teams = list(zip(goal_ranges, teams))
def get_team(goal_number):
# Get the leftmost occurence of the goal number, and extract the team from the tuple
return ordered_teams[bisect.bisect_left(ordered_teams, (goal_number,))][1]
你怎么能拿到W的2分和3分?W是4号吗?2+3等于5?你能提供一些额外的例子或问题陈述吗?@BAH,因为W连续4个进球。所以,第二个和第三个进球属于W。我认为基本上是第2个,第3个仍然在4个进球的范围内,所以W进球了。然后X又进了5个球(射程为9),这意味着X总共进了第7个球,依此类推。@BAH准确地说,谢谢你自己的回答,这几乎让我们达到了目标,但我需要导入
defaultdict
以获得你想要的格式,我们似乎只能使用内置的:teams\u和\u total\u goals=''。加入(团队*团队目标,zip中的目标(团队,目标))
我想在不导入更难的东西的情况下解决它。@jean导入对分和itertools
非常常见。它是内置标准库的一部分。我可以帮助编写第二个答案,但我相信这是一种非常有效的方法。可以将其视为使用任何其他内置的方法,如map()
或zip()
(其中itertools
有一个btw的实现)投票通过,但我希望你的第二个答案能接受,谢谢。+1,我经常使用itertools
模块,但从未真正使用过accumulate
;我甚至从未听说过bisect
。