猿问

如何从列表中提取嵌套在特定元素之间的元素,并将它们添加到新列表中?

我有一个时段列 (str),其中一天中的每个小时都有 1 或 0,具体取决于我们是否选择在该小时内运行广告活动。


例子:


daypart = '110011100111111100011110'

我想将其转换为以下字符串格式:


'0-1, 4-6, 9-15, 19-22'


上述格式更具可读性,并显示了活动运行的时间。


这就是我正在做的:


hours_list = []


ind = 0

for x in daypart:

    if int(x) == 1:

        hours_list.append(ind)

    else:

        hours_list.append('exclude')

    ind += 1

上面给了我一个这样的列表:


[0, 1, 'exclude', 'exclude', 4, 5, 6, 'exclude', 'exclude', 9, 10, 11, 12, 13, 14, 15, 'exclude', 'exclude', 'exclude', 19, 20, 21, 22, 'exclude']

现在我想找到一种方法将上述内容变成我想要的输出。我想做的是找到“排除”之间存在哪些元素,然后开始将它们添加到新列表中。然后,我可以从每个列表中取出最小和最大的元素,用“-”将它们连接起来,然后将所有此类列表附加在一起。


我有什么想法可以做到这一点,或者有更简单的方法来完成这一切吗?


慕桂英3389331
浏览 117回答 3
3回答

qq_笑_17

这是获取所有间隔的简单易读的代码:daypart = '1111111111111111111111'hours= []start, end = -1, -1for i in range(len(daypart)):    if daypart[i] == "1":        if end != -1:            end += 1         else:            start = i             end = i     else:        if end!=-1:            hours.append([start, end])            start, end = -1,-1if end!=-1:    hours.append([start, end])    start, end = -1,-1print(hours)

婷婷同学_

我建议您直接转换为所需的格式,而不是使用与原始输入具有完全相同信息的中间表示形式。让我们想想如何用语言来做到这一点:查找1输入字符串中的第一个将索引添加到列表中查找0字符串中的下一个。将比找到的索引少的一个添加到列表中。(或者可以将步骤 2 和 4 中的索引作为一对附加?)继续查找下一个1并重复步骤 2-4。我将其翻译成代码作为读者的练习。

明月笑刀无情

这也可以在理解中使用itertools.groupby, operator.itemgetter,来实现:enumeratefrom itertools import groupbyfrom operator import itemgetterdaypart = '110011100111111100011110'get_ends, get_one = itemgetter(0,-1), itemgetter(1)output = ', '.join('{0[0]}-{1[0]}'.format(*get_ends(list(g))) for k,g in groupby(enumerate(daypart), get_one) if k=='1')print(output)0-1, 4-6, 9-15, 19-22get_ends获取每个组中的第一个和最后一个元素,并get_one仅获取元素1,以便将其用作键。
随时随地看视频慕课网APP

相关分类

Python
我要回答