当我尝试优化这些代码行时,Python错误

时间:2016-09-09 15:03:41

标签: python

我使用python 2.7,我想减少和优化这些代码行,但我有一个问题,有人可以帮我吗?

我有这个列表B = [[0, Act1, XX1, u'P-Um'],.....[0, Act100, ZZ30, u'D- MOM']]

  1. 我只想从B
  2. 中取第4个值
  3. 取连字符后的部分和有时
  4. 的空格
  5. 带回B
  6. 现在我写了这段代码

    for i in range(len(B)):
            x.append(B[i][3])
            A = [i.split('-',1)[1] for i in x]  
            #A=[u'Um', u' LY', u' NO', ......, u' MOM']               
        for i in range(len(B)):
            A[i].lstrip()
            p = []
            for i in range(len(B)):
                p.append(A[i].lstrip())
            for i in range(len(B)):
                B[i][3] = p[i]
    

    当我尝试将其缩短时,我有两个错误。

    #Short version
    
    for i in range(len(B)):
            x.append(B[i][3])
            A = [i.split('-',1)[1], x] #Error:AttributeError: 'int' object has no           attribute 'split'
            B[i][3].append(A[i].lstrip()) #Error:AttributeError: 'unicode' object has no attribute 'append'
    

    我尝试了很多方法来解决错误但仍无法正常工作。你能帮帮忙吗?您是否认为可以缩短顶部而不会出错?

    非常感谢你。

3 个答案:

答案 0 :(得分:0)

您可以使用列表理解:

    B=[[B_element[0],B_element[1],B_element[2],B_element[3].split('-',1)[1].lstrip()] for B_element in B]

答案 1 :(得分:0)

我没有看到你尝试过的很多方法,但你的代码确实有一些失误。即使纠正了缩进错误,您的第一个变体也会迭代一个您不需要四次的索引,并将每个条目剥离两次(仅使用第二次的结果)。第二个版本首先失败,因为该索引不是条目,其次是因为您尝试更改字符串而不是替换它。

A=[]
x=[]
for Bi in B:
    Bi3 = Bi[3]
    part = Bi3.split('-',1)[1].lstrip()
    x.append(Bi3)       # Original B[i][3] data
    A.append(part)      # What is this for?
    Bi[3] = part        # replaces B[i][3]

如果你确实需要性能,那么正则表达式很可能比分割/条带组合更有效地提取部分,因为这些函数为每个调用创建新的字符串。

答案 2 :(得分:0)

您不必索引B的项目来迭代它们。这可能会有所帮助。

>>> Act1 = XX1 = Act100 = ZZ30 = None # simply to avoid NameError exceptions
>>> B = [[0, Act1, XX1, u'P-Um'],[0, Act100, ZZ30, u'D- MOM']]
>>> result = [b[3].split('-')[1].strip() for b in B]
>>> result
['Um', 'MOM']

result是一个列表,通过获取B中每个项目的元素3,将其拆分为'-'并从拆分字符串的元素1中去除前导和尾随空格来生成。我使用的技术称为list comprehension

如果您想用这些新值替换第四个元素,实现此目的的一种方法如下。

>>> final = []
>>> for b, r in zip(B, result):
...     final.append([b[0], b[1], b[2], r])
...
>>> final
[[0, None, None, 'Um'], [0, None, None, 'MOM']]

然后只需将B替换为final

>>> B = final