Python 写这份清单的更好方法是什么?

Python 写这份清单的更好方法是什么?,python,list-comprehension,Python,List Comprehension,我正在解析一个字符串,该字符串没有分隔符,但有字段开始和停止的特定索引。下面是我对从字符串生成列表的理解: field_breaks = [(0,2), (2,10), (10,13), (13, 21), (21, 32), (32, 43), (43, 51), (51, 54), (54, 55), (55, 57), (57, 61), (61, 63), (63, 113), (113, 163), (163, 213), (213, 238), (238, 240), (240, 2

我正在解析一个字符串,该字符串没有分隔符,但有字段开始和停止的特定索引。下面是我对从字符串生成列表的理解:

field_breaks = [(0,2), (2,10), (10,13), (13, 21), (21, 32), (32, 43), (43, 51), (51, 54), (54, 55), (55, 57), (57, 61), (61, 63), (63, 113), (113, 163), (163, 213), (213, 238), (238, 240), (240, 250), (250, 300)]
s = '4100100297LICACTIVE  09-JUN-198131-DEC-2010P0         Y12490227WYVERN RESTAURANTS INC                            1351 HEALDSBURG AVE                                                                                 HEALDSBURG               CA95448     ROUND TABLE PIZZA                                 575 W COLLEGE AVE                                 STE 201                                           SANTA ROSA               CA95401               '
data = [s[x[0]:x[1]].strip() for x in field_breaks]

关于如何改进的任何建议?

您可以通过执行以下操作将您的
字段分隔符
列表一分为二:

field_breaks = [0, 2, 10, 13, 21, 32, 43, ..., 250, 300]
s = ...
data = [s[x[0]:x[1]].strip() for x in zip(field_breaks[:-1], field_breaks[1:])]

您可以使用元组解包来获得更清晰的代码:

data = [s[a:b].strip() for a,b in field_breaks]

下面是使用
map

data = map(s.__getslice__, *zip(*field_breaks))

老实说,我觉得按列号解析的方法可读性不是很好,我对它的可维护性提出了质疑(一个错误一个错误等等)。虽然我确信列表理解在这种情况下是非常有益和有效的,并且建议的基于zip的解决方案有一个很好的功能调整

取而代之的是,我将从左栏的这里扔垒球,因为列表理解应该是让代码更具声明性的一部分。对于完全不同的东西,考虑下面的方法:基于<代码> PyPARSUN 模块:

def Fixed(chars, width):
    return Word(chars, exact=width)

myDate = Combine(Fixed(nums,2) + Literal('-') + Fixed(alphas,3) + Literal('-')
                 + Fixed(nums,4))

fullRow = Fixed(nums,2) + Fixed(nums,8) + Fixed(alphas,3) + Fixed(alphas,8)
          + myDate + myDate + ...

data = fullRow.parseString(s)
# should be ['41', '00100297', 'LIC', 'ACTIVE  ', 
#            '09-JUN-1981', '31-DEC-2010', ...]
为了使其更具声明性,您可以在遇到每个字段时命名它们。我不知道这些字段实际上是什么,但类似于:

someId = Fixed(nums,2)
someOtherId = Fixed(nums,8)
recordType = Fixed(alphas,3)
recordStatus = Fixed(alphas,8)
birthDate = myDate
issueDate = myDate
fullRow = someId + someOtherId + recordType + recordStatus
          + birthDate + issueDate + ...

现在这样的方法可能不会打破任何陆地速度记录。但是,天哪,你不觉得这个更容易阅读和维护吗?

这让我想起了这个固定宽度的格式:@icktoofay-Ha,是的。不幸的是,这个数据没有真正的API…我假设真正的代码从文件中读取数据,而不是将其存储在字符串文本中。至少,我希望是这样。+1,这也可以与dan04的想法结合起来(可能使用源代码中的
pairwise
)+1:减少冗余和文书错误风险的好主意。将此与Tomasz Wysocki的解决方案相结合,就完美了。也很容易阅读。谢谢!我将使用这个方法,因为我喜欢减少字段_中断的一侧。非常好-我将添加一个解析操作,在解析期间将mydate转换为Python datatime,以及一些结果名称,以便解析后可以轻松访问值,并且日期已经可以用作DateTime。(Fixed也是一个不错的小帮手。)