我想要一个看起来像这样的字符串:'Oreo.12.37-40.Apple.78'并将其变成一个如下所示的列表:
['Oreo', 12, 37, 38, 39, 40, 'Apple', 78]
' - '导致值之间的迭代。 ('37 -40'变为[37,38,39,40])
https://stackoverflow.com/a/5705014/1099935 有一个非常好的解决方案,但我不太了解它如何合并字符串处理。 (它仅适用于数字,但在int()中使用字符串失败
注释为我锁定(?),所以这里有一个额外的注释:我需要列表包含int值或字符串。然后在过滤器项目中使用Q对象可以按通用名称或指定的产品密钥进行过滤(通常很短,也常用)
答案 0 :(得分:1)
这是一个选项:
def custom_split(s):
def int_range_expand(s):
try:
return [int(s)]
except ValueError:
try:
start, end = map(int, s.split('-'))
return range(start, end+1)
except Exception:
pass
return [s]
return sum(map(int_range_expand, s.split('.')), [])
>>> custom_split('Oreo.12.37-40.Apple.78')
['Oreo', 12, 37, 38, 39, 40, 'Apple', 78]
这使用EAFP方法,步骤细分如下:
1. custom_split('Oreo.12.37-40.Apple.78')
2. s <= 'Oreo.12.37-40.Apple.78'
3. s.split('.') => ['Oreo', '12', '37-40', 'Apple', '78']
4. map(int_range_expand, ['Oreo', '12', '37-40', 'Apple', '78'])
=> [['Oreo'], [12], [37, 38, 39, 40], ['Apple'], [78]]
5. sum([['Oreo'], [12], [37, 38, 39, 40], ['Apple'], [78]], [])
=> ['Oreo', 12, 37, 38, 39, 40, 'Apple', 78]
步骤4中的int_range_expand()
功能始终返回一个列表。如果参数是字符串或int,则结果只有一个元素,但如果它是37-40
之类的范围,那么它将包含该范围内的每个整数。这使我们可以轻松地将所有结果列表链接到一个列表中。
第5步类似于itertools.chain
,效率更高但需要导入模块,最好是你。
答案 1 :(得分:1)
这样做:
#!/usr/bin/python
import re
s = 'Oreo.12.37-40.Apple.78'
l=[]
for e in re.split('[^\w-]+',s):
m=re.match('(\d+)-(\d+)',e)
if m:
x=int(m.group(1))
y=int(m.group(2))
for i in range(x,y+1):
l.append(i)
else:
try:
l.append(int(e))
except ValueError:
l.append(e)
print l
输出:
['Oreo', 12, 37, 38, 39, 40, 'Apple', 78]