当前位置: 首页 > 面试题库 >

将整数列表转换为逗号分隔范围的字符串的Pythonic方法

殳经略
2023-03-14
问题内容

我有一个整数列表,需要将其解析为一系列字符串。

例如:

 [0, 1, 2, 3] -> "0-3"
 [0, 1, 2, 4, 8] -> "0-2,4,8"

等等。

我仍在学习处理列表的更多pythonic方法,这对我来说有点困难。我最近的想法是创建一个列表列表,以跟踪成对的数字:

[ [0, 3], [4, 4], [5, 9], [20, 20] ]

然后,我可以遍历此结构,将每个子列表打印为范围或单个值。

我不喜欢在两次迭代中执行此操作,但是我似乎无法跟踪每次迭代中的每个数字。我的想法是做这样的事情:

这是我最近的尝试。它有效,但是我并不完全满意;我一直在想,有一个更优雅的解决方案完全让我无法幸免。我知道,字符串处理迭代并不是最好的方法-
对我来说这是一大清早:)

def createRangeString(zones):
        rangeIdx = 0
        ranges   = [[zones[0], zones[0]]]
        for zone in list(zones):
            if ranges[rangeIdx][1] in (zone, zone-1):
                ranges[rangeIdx][1] = zone
            else:
                ranges.append([zone, zone])
                rangeIdx += 1

        rangeStr = ""
        for range in ranges:
            if range[0] != range[1]:
                rangeStr = "%s,%d-%d" % (rangeStr, range[0], range[1])
            else:
                rangeStr = "%s,%d" % (rangeStr, range[0])

        return rangeStr[1:]

有没有简单的方法可以将其合并为单个迭代?我还能做些什么使它变得更Pythonic?


问题答案:
>>> from itertools import count, groupby
>>> L=[1, 2, 3, 4, 6, 7, 8, 9, 12, 13, 19, 20, 22, 23, 40, 44]
>>> G=(list(x) for _,x in groupby(L, lambda x,c=count(): next(c)-x))
>>> print ",".join("-".join(map(str,(g[0],g[-1])[:len(g)])) for g in G)
1-4,6-9,12-13,19-20,22-23,40,44

这里的想法是将每个元素与count()配对。然后,对于连续值,该值与count()之间的差是恒定的。groupby()完成其余工作

正如Jeff所建议的那样,count()可以使用替代方法enumerate()。这增加了一些多余的杂物,需要在print语句中删除

G=(list(x) for _,x in groupby(enumerate(L), lambda (i,x):i-x))
print ",".join("-".join(map(str,(g[0][1],g[-1][1])[:len(g)])) for g in G)

更新: 对于此处给出的示例列表,带有枚举的版本比我计算机上使用count()的版本慢大约5%。



 类似资料:
  • 问题内容: 如何在Java中转换为逗号分隔的字符串? 结果我想要: 这是非常相似的参考问题,但是这些解决方案都无法提供结果,这正是我所需要的。 到目前为止我尝试过的 问题答案: 这是一个流版本,在功能上等同于khelwood,但使用了不同的方法。 他们都创建了一个,将每个映射到一个,并用逗号将它们连接在一起。 它们在性能上也应该完全相同,尽管从 技术上讲 我是直接打电话给他,而他是在打电话给代表。

  • 如何在Java中将int[]转换为逗号分隔的字符串? 我想要的结果是: 这里有非常相似的参考问题,但这些解决方案都没有提供我需要的结果。 > 如何在Java中使用toString方法将int数组转换为String 如何在不SomeType@2f92e0f4的情况下打印Java对象? 如何转换列表 到目前为止我所做的,

  • 本文向大家介绍在Java中将字符串列表转换为逗号分隔的字符串,包括了在Java中将字符串列表转换为逗号分隔的字符串的使用技巧和注意事项,需要的朋友参考一下 首先,让我们说以下是我们的String列表- 现在,使用String.join()将其转换为逗号分隔的字符串 示例 以下是在Java中将字符串列表转换为逗号分隔的字符串的程序- 输出结果

  • 问题内容: 我知道如果要将s 数组转换为a ,我可以这样做: 但我不知道如何将s 数组转换为逗号分隔 问题答案: 好吧,你可以这样做:

  • 本文向大家介绍在 Java 中将字符串转换为逗号分隔的 List(列表),包括了在 Java 中将字符串转换为逗号分隔的 List(列表)的使用技巧和注意事项,需要的朋友参考一下 首先,设置一个具有字符串值的列表- 现在,使用String.join()将它们设置为逗号分隔的列表- 示例 以下是在Java中将字符串转换为逗号分隔列表的程序- 输出结果

  • 我想使用python将字符串转换成整数列表。一些例子可能是: 有没有快速简单的方法来做到这一点?