Python:将1,2,3-7,8,9,10变成字符串,看起来像1,2,3,4,5,6,7,8,9,10

时间:2017-11-09 10:01:55

标签: python

我在射程方面做了很多工作,并在这个方面遇到了障碍。我试图将范围转换为完整的数字列表。

SELECT R.ID, R.DESCRIZIONE
FROM AA_V_ATS_RICHIESTE R
WHERE R.FILESTATEID = 200
UNION ALL
SELECT R.ID, R.DESCRIZIONE
FROM AA_V_ATS_RICHIESTE R
WHERE R.FILESTATEID = 140
UNION ALL
SELECT R.ID, R.DESCRIZIONE
FROM AA_V_ATS_RICHIESTE R
WHERE R.FILESTATEID = 5
UNION ALL
...

我想要打印字符串的结果是' 1,2,3,4,5,6,10'。所以基本上显示了全范围。

所以大部分问题是如何使用python

将3-6变为3,4,5,6

任何帮助都会非常感激!

5 个答案:

答案 0 :(得分:5)

您可以使用regex模式查找每个范围和函数,以便用数字列表替换范围:

import re
s = '1,2,3-6,10'

def replace_range_by_ints(m):
    a = m.group(1)
    b = m.group(2)
    return ','.join(str(i) for i in range(int(a), int(b) + 1))

pattern = re.compile('(\d+)\-(\d+)')
print(re.sub(pattern, replace_range_by_ints, s))
# 1,2,3,4,5,6,10

答案 1 :(得分:3)

如果检测到-,则创建范围的单行(带边界修复),否则只转换为整数:

import itertools

result = [x for y in '-1,1,2,3-6,10'.split(",") for x in (range(int(y.split("-")[0]),int(y.split("-")[1])+1) if y.find("-")>0 else [int(y)]) ]

结果(作为整数列表):

[-1, 1, 2, 3, 4, 5, 6, 10]

请注意,它也处理负数(y.find("-")>0确保-在检测范围时不会启动),但不是负范围(必须为此选择另一个分隔符,如{{1} }})

答案 2 :(得分:1)

我认为这会输出你需要的东西,它有点长,但演示了这个过程。

string = '1,2,3-6,10'
splt_a = string.split(",")
o = []

for s in splt_a:
    if "-" in s:
        splt_b = s.split("-")
        for i in range(int(splt_b[0]), int(splt_b[1]) + 1):
            o.append(i)
    else:
        o.append(int(s))

print(o) # [1, 2, 3, 4, 5, 6, 10]

答案 3 :(得分:1)

您可以使用以下功能:

def range_to_list(l):
     result = []
     for part in l.split(','):
         if '-' in part:
             a, b = part.split('-')
             a, b = int(a), int(b)
             result.extend(range(a, b + 1))
         else:
             a = int(part)
             result.append(a)
     return result

然后你会得到:

>>> myStr =  '1,2,3-6,10'
>>> range_to_list(myStr)
[1, 2, 3, 4, 5, 6, 10]

答案 4 :(得分:1)

为什么不为该构造构建一个简单的解析器?我猜你计划从外部数据源处理某种输入,否则你的问题没有多大意义:手动解决一些规范更容易,而不是编写特殊代码来处理它。

这种方法将遵循以下步骤:

  • 为输出准备一个空列表
  • 将输入字符串拆分为“,”
  • 对于每个项目检查是否存在“ - ”
    • 如果没有=>将项目转换为int并将其放入输出列表
    • if yes =>
      • 将字符串拆分为“ - ”
      • 将一系列int值添加到输出列表
  • 返回输出列表

我想这是最简单的方法。使用字符串提供的split方法来分割字符串和使用int(...)函数将字符串转换为int来编写代码应该非常简单。

构建这样一个简单的解析器无论如何都会有很大的优势:您可以同时验证您收到的输入是否完全有效。您甚至可以检查提供的值是否按递增顺序排列。如果我查看您提供的示例,这似乎是一个基本条件。