如何按特定项目剪切列表?

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


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'

我无法弄清楚出了什么问题。


婷婷同学_
浏览 237回答 5
5回答

慕斯709654

您收到错误是因为您将list.append()函数的结果- 即None-分配给up了up, down = up.append(down[: (down.index("b") + 1)]), down[...snipp...] #          ^^^^^^^^ returns Nonelist.append是一个返回的“就地”操作,None因此up将None在下一次迭代中进行。保持最接近你可以使用的东西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 commentprint(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因此它的性能比简单地迭代一次列表更差。

一只名叫tom的猫

像这样的问题没有itertools答案会是什么?groupby在这种情况下,您可以使用自定义键来计算过去出现的'b':from itertools import groupbyclass CountKey:    def __init__(self, what):        self.what = what        self.count = 0    def __call__(self, item):        count = self.count        if item == self.what:            self.count += 1        return countup = [list(g) for k, g in groupby(down, CountKey('b'))]

精慕HU

down = ["a", "b", "c", "d", "b", "e", "r"]indices = [i for i, x in enumerate(down ) if x == "b"]curr=0master_list=[]for item in indices:    master_list.append(down[curr:item+1])    print(master_list)    curr=item+1if curr !=len(down):    master_list.append(down[curr:len(down)])print(master_list)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python