我在射程方面做了很多工作,并在这个方面遇到了障碍。我试图将范围转换为完整的数字列表。
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任何帮助都会非常感激!
答案 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)
为什么不为该构造构建一个简单的解析器?我猜你计划从外部数据源处理某种输入,否则你的问题没有多大意义:手动解决一些规范更容易,而不是编写特殊代码来处理它。
这种方法将遵循以下步骤:
我想这是最简单的方法。使用字符串提供的split
方法来分割字符串和使用int(...)
函数将字符串转换为int来编写代码应该非常简单。
构建这样一个简单的解析器无论如何都会有很大的优势:您可以同时验证您收到的输入是否完全有效。您甚至可以检查提供的值是否按递增顺序排列。如果我查看您提供的示例,这似乎是一个基本条件。