根据另一个列表给定的索引号拆分列表

时间:2018-11-09 11:37:18

标签: python

对不起,我是一个初学者,正在寻找处理某些数据的帮助。

所以我有两个列表:

一个描述游戏中所有参与者的分数 另一个包含每个参与者玩游戏的次数

scores=['win', 'draw', 'lose', 'lose', 'win', 'win']
trials=[2,3,1]

这意味着有3位参与者,第一次参加了两次比赛,并获得了“胜利”和“平局”等。

如何拆分分数列表,使其成为一个嵌套列表,将每个参与者的分数作为列表?我想找到一个人的平均分数。

例如splitscores=[['win','draw']['lose','lose','win']['win]]

我已经通过以下方式获得了第一次审判:

trial1=[]
for item in scores:
    trial1.append(scores[:trials[0]])
print(trial1)

但不知道通过循环获得其他线索 有人可以帮忙吗?还是我有更好的方法来找到一个人的平均分数?

3 个答案:

答案 0 :(得分:5)

您可以使用itertools.accumulate来累加trials列表。然后对切片使用列表理解:

from itertools import accumulate

scores = ['win', 'draw', 'lose', 'lose', 'win', 'win']
trials = [2,3,1]

idx = [0] + list(accumulate(trials))
res = [scores[start:end] for start, end in zip(idx, idx[1:])]

[['win', 'draw'], ['lose', 'lose', 'win'], ['win']]

对于真正的惰性解决方案,您可以使用itertools pairwise recipe

from itertools import accumulate, tee

def pairwise(iterable):
    a, b = tee(iterable)
    next(b, None)
    return zip(a, b)

idx = accumulate([0] + trials)
res = [scores[start:end] for start, end in pairwise(idx)]

[['win', 'draw'], ['lose', 'lose', 'win'], ['win']]

答案 1 :(得分:4)

您可以通过使用next()AudioInputStream转换为列表迭代器来调用iter()

scores

答案 2 :(得分:4)

其他答案很好。如果您发现更清晰的话,也可以使用简单的for循环来完成此操作:

scores = ['win', 'draw', 'lose', 'lose', 'win', 'win']
trials = [2, 3, 1]
trial1 = []
# This variable holds the first index of the next sublist
idx = 0
for n in trials:
    trial1.append(scores[idx:idx + n])
    # The next sublist starts where the previous one ended
    idx += n
print(trial1)

输出:

[['win', 'draw'], ['lose', 'lose', 'win'], ['win']]