首页 > 解决方案 > 如何按特定项目剪切列表?

问题描述

我正在尝试按其中的特定项目剪切列表,例如,我有一个这样的列表:

down = ["a", "b", "c", "d", "b", "e", "r"]

我想要的是:

[["a", "b"]["c", "d", "b"] ["e", "r"]]

每次出现"b".

我写了这样的东西:

down = ["a", "b", "c", "d", "b", "e", "r"]
up = []
while down is not []:
    up, down = up.append(down[:(down.index("b") + 1)]), down[(down.index("b") + 1):]

它抛出一个错误:

AttributeError: 'NoneType' object has no attribute 'append'

我不知道出了什么问题。

标签: pythonlist

解决方案


您收到错误是因为您将list.append()函数的结果 - 即None-分配up

up, down = up.append(down[: (down.index("b") + 1)]), down[...snipp...] 
#          ^^^^^^^^ returns None

list.append是一个返回的“就地”操作,None因此upNone在下一次迭代中出现。

保持最接近你可以使用的东西

down = ["a", "b", "c", "d", "b", "e", "r"]
up = []
while 'b' in down:
    b_index = down.index('b') + 1
    up.append(down[:b_index])
    down = down[b_index:]
up.append(down)

但在我看来,简单地迭代你的原始并将子列表组装到第二个列表中会更干净:

k = ["a", "b", "c", "d", "b", "e", "r"]

result = [[]]
for e in k:
    if e != "b":
        result[-1].append(e)
    else:
        result[-1].append(e)
        result.append([])

if result[-1] == []: 
    result.pop() # thx iBug's comment

print(result) # [['a', 'b'], ['c', 'd', 'b'], ['e', 'r']]

我认为这比您的代码尝试做的要清楚得多-您的“我想要的["a", "b"]["c", "d", "b"] ["e", "r"]”不是有效的python。


稍微不同的代码版本是:

k = ["a", "b", "c", "d", "b", "e", "r"]
b = []
while True:
    try:
        b_idx = k.index("b")
    except: 
        b.append(k)
        break
    else:
        b,k = b+[k[:b_idx+1]],k[b_idx+1:]
print(b) 

但是您需要对您的列表进行更远的搜索.index()try: except因此它的性能更差,然后只需迭代一次列表。


推荐阅读