【问题标题】:Python Error's when I try to optimize those lines of code当我尝试优化这些代码行时出现 Python 错误
【发布时间】:2016-09-09 15:03:40
【问题描述】:

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

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

  1. 我只想取 B 的第四个值
  2. 只取连字符后面的部分和有时需要的空格
  3. 带回 B

现在我写了这段代码

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'

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

非常感谢您。

【问题讨论】:

  • 在使用嵌套循环时停止使用i作为变量的名称,你总是会覆盖它的值
  • 由于使用了一个字母的变量名,这段代码有点难以理解。最好为变量使用描述性名称(通常)。
  • 您的列表甚至不起作用:有变量、整数和字符串...然后,您正在拆分 range 返回的索引:没办法,那么您将附加到您的一个unicode 列表对象:也没有办法......不清楚......
  • 请提供几个具体的输入/输出列表。我无法让你的第一个代码工作。

标签: python


【解决方案1】:

您可以使用列表推导:

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

【讨论】:

    【解决方案2】:

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

    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]
    

    如果您确实需要性能,那么正则表达式很可能会比拆分/剥离组合更有效地提取部分,因为这些函数会为每次调用创建新字符串。

    【讨论】:

      【解决方案3】:

      您不必索引 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-11-07
        • 2021-05-28
        • 2019-01-26
        • 2021-12-24
        • 2021-08-18
        • 1970-01-01
        • 2014-05-13
        相关资源
        最近更新 更多