繁体   English   中英

使用python将字符串和整数(w / sets)从字符串解析为列表

[英]Parsing strings and integers(w/sets) from a string to a list using python

我想要一个看起来像这样的字符串:'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对象可以按通用名称或分配的产品密钥进行过滤(通常较短且也常用)

这是一个选项:

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 ,它更有效但需要导入模块,最好是你。

这样做:

#!/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]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM