我使用python 2.7,我想减少和优化这些代码行,但我有一个问题,有人可以帮我吗?
我有这个列表B = [[0, Act1, XX1, u'P-Um'],.....[0, Act100, ZZ30, u'D- MOM']]
现在我写了这段代码
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'
我尝试了很多方法来解决错误但仍无法正常工作。你能帮帮忙吗?您是否认为可以缩短顶部而不会出错?
非常感谢你。
答案 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