【问题标题】:Compare adjacent variable in list and reformat the input [duplicate]比较列表中的相邻变量并重新格式化输入[重复]
【发布时间】:2020-09-03 03:16:59
【问题描述】:
inp = [1, 2, 3, 5, 7, 8, 9, 10, 11, 12, 14, 17, 20, 25,27,28,29,31]

预期输出:如果相邻变量是串联的,则用连字符填充。如果没有,请附加给定的数字。

Expected Output = [1-3,5,7-12,14,17,20,25,27-29,31]

我使用下面的代码获取了一个相邻的数字。但不满足要求。

inp = [1, 2, 3, 5, 7, 8, 9, 10, 11, 12, 14, 17, 20, 25,27,28,29,31]
for x,y in zip(inp[::],inp[1::]):
    print(x,y)

【问题讨论】:

  • 输入是关键字,千万不要用它来命名变量。此外,输出 lis 将包含项目或字符串类型
  • 是的..注意。谢谢。请帮助解决这个难题

标签: python python-3.x list


【解决方案1】:

你可以使用itertools.groupby:

from itertools import groupby

lst = [1, 2, 3, 5, 7, 8, 9, 10, 11, 12, 14, 17, 20, 25,27,28,29,31]

out = []
for _, g in groupby(enumerate(lst), lambda k: k[1]-k[0]):
    g = [*g]
    if len(g) == 1:
        out.append(str(g[0][1]))
    else:
        out.append('{}-{}'.format(g[0][1], g[-1][1]))

print(out)

打印:

['1-3', '5', '7-12', '14', '17', '20', '25', '27-29', '31']

【讨论】:

    【解决方案2】:

    如果您使用来自more-itertoolsconsecutive_groups 函数,这是一项非常简单的任务。这在引擎盖下使用itertools.groupby,类似于@Andrej Kesely's 答案。如果你想看源码看看这是怎么实现的,这里是GitHub上的函数。

    from more_itertools import consecutive_groups
    
    inp = [1, 2, 3, 5, 7, 8, 9, 10, 11, 12, 14, 17, 20, 25, 27, 28, 29, 31]
    
    result = [
        f"{group[0]}-{group[-1]}" if len(group) > 1 else f"{group[0]}"
        for group in map(list, consecutive_groups(inp))
    ]
    
    print(result)
    

    输出:

    ['1-3', '5', '7-12', '14', '17', '20', '25', '27-29', '31']
    

    【讨论】:

    • 哇!!!。这太棒了。非常感谢。我会检查文档以了解更多信息。感谢您的参考。
    猜你喜欢
    • 1970-01-01
    • 2021-04-28
    • 1970-01-01
    • 1970-01-01
    • 2015-09-09
    • 1970-01-01
    • 2012-12-01
    • 2016-10-07
    • 1970-01-01
    相关资源
    最近更新 更多