如何从列表列表中添加特定元素?

How to add specific elements from list of lists?

假设我有以下包含其他列表的列表:

episodes = [
['1', '2', '3', '4', '5', '6', '7'], 
['1', '2', '3', '4', '5', '1', '2', '3', '4', '5', '6'], 
['1', '2', '3', '1', '2', '3', '4', '5', '6', '1', '2', '3', '4', '5', '6', '1', '2', '3', '4', '1', '2', '3']
]

每个列表都是指电视节目的剧集。例如,第一个列表有一季有 7 集,而最后一个列表有五个季,第一季有 3 集,第二季有 6 集,依此类推。我想通过添加电视节目每个季节的总集数来保存每个电视节目的总集数。换句话说,第一个列表只取该列表的最后一个元素,但最后一个列表我必须添加 3 & 6 & 6 & 4 & 3.

我希望你明白我想做什么。我考虑过使用索引并查看元素 '1' 在每个超过一季的列表中的位置,这样我就可以选择之前的元素(上一季的剧集数)等等。但是对于所有其他季节来说,这样做也有点棘手。

如果我没理解错的话,你可以把每个列表的长度加起来,即 sum(map(len, episodes))?

如果您只想计算总集数而不考虑季节,只需计算每个节目列表的长度即可。

episodes = [
['1', '2', '3', '4', '5', '6', '7'], 
['1', '2', '3', '4', '5', '1', '2', '3', '4', '5', '6'], 
['1', '2', '3', '1', '2', '3', '4', '5', '6', '1', '2', '3', '4', '5', '6', '1', '2', '3', '4', '1', '2', '3']
]

print(*[len(show) for show in episodes], sep="\n")

输出

7
11
22

更简单的解决方案

最后,就这么简单:

list(map(len, episodes))
## [7, 11, 22]

如果始终列出所有剧集,那么您可以只计算剧集总数 - 这将始终与您确定最大数量并将它们相加相同。

更精细的解决方案

from functools import reduce

def list_to_max_seasons(lst, first_element='1'):
    return reduce(lambda l, x: l + [x] if x == first_element else l[:-1] + [x], lst, [])

def sum_max_episodes(lol):
     return [(lambda l: sum([int(x) for x in l]))(list_to_max_seasons(il)) for il in lol]

测试者:

sum_max_episodes(episodes)
## [7, 11, 22]

更详细(递归)的解决方案

我承认,这些解决方案不是很 pythonic。 但是它们很普遍。

def list_to_seasons(l, acc=[], by='1', tmp=[]):
    if l == []:
        return acc+[tmp]
    elif l[0] == by:
        if tmp == []:
            return list_to_seasons(l[1:], acc=[], by=by, tmp=[l[0]])
        else:
            return list_to_seasons(l[1:], acc=acc+[tmp], by=by, tmp=[l[0]])
    else:
        return list_to_seasons(l[1:], acc=acc, by=by, tmp=tmp+[l[0]])


list_to_seasons(['1','2','3','1','2','1','2','3','1','1'])
## [['1', '2', '3'], ['1', '2'], ['1', '2', '3'], ['1'], ['1']]

或者:

def list_to_max_seasons(l, acc=[], by='1', last=None):
    if l == []:
        return acc+[last]
    elif l[0] == by:
        if last is None:
            return list_to_max_seasons(l[1:], acc=[], by=by, last=l[0])
        else:
            return list_to_max_seasons(l[1:], acc=acc+[last], by=by, last=l[0])
    else:
        return list_to_max_seasons(l[1:], acc=acc, by=by, last=l[0])
list_to_max_seasons(['1','2','3','1','2','1','2','3','1','1'])
## ['3', '2', '3', '1', '1']

然后:

def sum_max_episodes(lol):
     return [(lambda l: sum([int(x) for x in l]))(list_to_max_seasons(il)) for il in lol]

测试者:

sum_max_episodes(episodes)
## [7, 11, 22]

我想出了这样的方法来检查每个季节的剧集数:

episodes = [
    ['1', '2', '3', '4', '5', '6', '7', "8", "9", "10", "11"],
    ['1', '2', '3', '4', '5',
     '1', '2', '3', '4', '5', '6'],
    ['1', '2', '3',
     '1', '2', '3', '4', '5', '6',
     '1', '2', '3', '4', '5', '6',
     '1', '2', '3', '4',
     '1', '2', '3']
]


def count_episodes(list_of_episodes):
    all_episodes = [e for l in list_of_episodes for e in l]
    previous_episode = 0
    season = 1
    seasons = {}
    tmp_list = []

    for i in all_episodes:
        if previous_episode > int(i):
            seasons["season "+str(season)] = tmp_list
            tmp_list = []
            season += 1
        previous_episode = int(i)
        tmp_list.append(i)

    if len(tmp_list) > 0:
        seasons["season "+str(season)] = tmp_list

    for i in seasons:
        print(i + " has {} episodes".format(len(seasons[i])))


count_episodes(episodes)

输出

season 1 has 11 episodes
season 2 has 5 episodes
season 3 has 6 episodes
season 4 has 3 episodes
season 5 has 6 episodes
season 6 has 6 episodes
season 7 has 4 episodes
season 8 has 3 episodes