【问题标题】:For every consecutive number对于每个连续的数字
【发布时间】:2021-02-08 15:18:22
【问题描述】:

我有一个包含诸如[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]}

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

【问题讨论】:

  • 它们总是成对出现,还是列表中的数字也可能不连续?
  • Katsu,我已经改进了您的示例输入,希望能澄清您的文字解释的内容。请检查我对您的文字的阅读是否正确。
  • @paxdiablo 我认为代表 OP 用预期结果更改问题不是一个好主意。例如,在这种情况下,OP 可以说他所有的数字都是成对的,在这种情况下,可以通过切片(或zip)来获取答案。你的解决方案将是一个矫枉过正
  • 欢迎来到 Stack Overflow!请拨打tour,阅读what's on-topic hereHow to Askquestion checklist,并提供minimal reproducible example。 “为我实现此功能”与此站点无关。你必须诚实地尝试,然后就你的算法或技术提出一个具体问题
  • @Anonymous:我只改了例子中使用的data,然后只因为文本(“对于每一组连续的数字,构造一个字典,key代表从 1 开始的一组连续数字,以及连续数字的值”)清楚地说明了预期的内容(连续数字组,而不是对)。文本本身没有任何改变。这样做是因为有几个答案假设成对,所以需要一些明确性。我还要求 OP 检查我的更改是否符合要求。

标签: python list dictionary


【解决方案1】:

下面的代码会做你想做的事:

def splitCons(lst):
    retlst = {}

    # Keep empty dict unless there are items.

    if len(lst) > 0:
        # Populate first keyed item with first element.

        key = 1
        retlst = {key:[lst[0]]}

        # Process other elements.

        for num in lst[1:]:
            # Consecutive to previous? Add to existing. Otherwise, add to new.

            if num == retlst[key][-1] + 1:
                retlst[key].append(num)
            else:
                key += 1
                retlst[key] = [num]

    return retlst

print(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]
}

【讨论】:

  • 感谢您的明确回答,非常有帮助
【解决方案2】:

以下将生成您想要的输出:

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]}

【讨论】:

  • 假设对,根据问题文本并非如此(尽管 OP 可能应该选择更好的测试数据)。
  • 是的,刚刚注意到。修好了。
【解决方案3】:

试试这个:

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

【讨论】:

    【解决方案4】:
    l = [2, 3, 9, 10, 16, 17, 23, 24]
    print({i: c for i, c in enumerate(zip(l[::2], l[1::2]), 1)})
    

    可能有点复杂,但使用字典和列表理解以及 zip 函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-15
      • 1970-01-01
      • 1970-01-01
      • 2022-11-24
      • 1970-01-01
      相关资源
      最近更新 更多