Python 对于每一个连续的数字

Python 对于每一个连续的数字,python,list,dictionary,Python,List,Dictionary,我有一个包含数据的列表,比如[2,3,9,10,16,17,23,24,99,112,113,114,299],我想做的是,对于每一组连续数字,构造一个字典,其中键表示从1开始的连续数字集,值表示连续数字集 预期输出应如下所示: {1: [2, 3], 2: [9, 10], 3: [16, 17], 4: [23, 24], 5: [99], 6: [112, 113, 114], 7: [299]} 有没有一种有效的方法可以做到这一点?以下代码将满足您的需要: def分离器(lst): r

我有一个包含数据的列表,比如
[2,3,9,10,16,17,23,24,99,112,113,114,299]
,我想做的是,对于每一组连续数字,构造一个字典,其中键表示从1开始的连续数字集,值表示连续数字集

预期输出应如下所示:

{1: [2, 3], 2: [9, 10], 3: [16, 17], 4: [23, 24], 5: [99], 6: [112, 113, 114], 7: [299]}

有没有一种有效的方法可以做到这一点?

以下代码将满足您的需要:

def分离器(lst):
retlst={}
#除非有物品,否则请保留空目录。
如果len(lst)>0:
#用第一个元素填充第一个键控项。
键=1
retlst={key:[lst[0]]}
#处理其他元素。
对于lst[1:]中的num:
#连续到上一个?添加到现有的。否则,添加到新的。
如果num==retlst[键][-1]+1:
retlst[key].append(num)
其他:
键+=1
retlst[key]=[num]
返回retlst
打印(splitCons([2,3,9,10,16,17,23,24,99,112,113,114,299]))
它只是创建字典,或者将元素添加到当前的最后一个键(如果连续),或者启动一个新键(如果不连续)

给定脚本中测试数据的输出(稍微修改以显示正确的操作,其中集合不总是成对的),并格式化为可读性:

{
1: [2, 3],
2: [9, 10],
3: [16, 17],
4: [23, 24],
5: [99],
6: [112, 113, 114],
7: [299]
}

以下内容将生成所需的输出:

def cons(lst):
    i, res = 0, {}
    for x in lst:
        if i not in res or res[i][-1] != x-1:
             i += 1
             res[i] = []
        res[i].append(x)
    return res

cons([2, 3, 9, 10, 16, 17, 23, 24])
# {1: [2, 3], 2: [9, 10], 3: [16, 17], 4: [23, 24]}
试试这个:

source = [2, 3, 9, 10, 16, 17, 23, 24]
result = dict()
temp_list = list()
internal_counter = 1

for index, item in enumerate(source):
    temp_list.append(item)
    if (index + 1) % 2 == 0:
        result.setdefault(internal_counter, []).extend(temp_list)
        temp_list = list()
        internal_counter += 1

可能有点复杂,但使用字典和列表理解和zip功能。

它们总是成对的,还是列表中也可能有不连续的数字?Katsu,我改进了您的示例输入,希望澄清您的文本解释。请检查我对您的文本的阅读是否正确。@paxdiablo我认为代表OP以预期结果更改问题不是一个好主意。例如,在这种情况下,OP可以说他的所有数字都是成对的,在这种情况下,答案可以通过切片(或
zip
)获取。您的解决方案对IT来说是一个致命一击欢迎使用堆栈溢出!请拿起,阅读,和,并提供一个。“为我实现此功能”是本网站的主题。你必须诚实地尝试,然后就你的算法或技术提出一个具体的问题。@Anonymous:我只是更改了示例中使用的数据,然后只是因为文本(“对于每一组连续数字,构造一个字典,其中键表示从1开始的连续数字集,连续数字的值”)明确了期望值(连续数字组,而不是成对)。文本本身没有任何更改。之所以这样做,是因为有多个答案假设成对,因此需要一些明确性。我还要求OP检查我的更改是否符合要求。假设成对,根据问题文本,情况并非如此(尽管OP可能应该选择更好的测试数据).是的,刚刚注意到。修好了。谢谢你清晰的回答,非常有用
l = [2, 3, 9, 10, 16, 17, 23, 24]
print({i: c for i, c in enumerate(zip(l[::2], l[1::2]), 1)})