为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

婷婷同学_ 2021-09-25 16:31:41
我正在尝试按其中的特定项目剪切列表,例如,我有一个这样的列表: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'我无法弄清楚出了什么问题。
查看完整描述

5 回答

?
慕斯709654

TA贡献1840条经验 获得超5个赞

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


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

#          ^^^^^^^^ returns None

list.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 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因此它的性能比简单地迭代一次列表更差。


查看完整回答
反对 回复 2021-09-25
?
一只名叫tom的猫

TA贡献1906条经验 获得超3个赞

像这样的问题没有itertools答案会是什么?


groupby在这种情况下,您可以使用自定义键来计算过去出现的'b':


from itertools import groupby


class 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 count


up = [list(g) for k, g in groupby(down, CountKey('b'))]


查看完整回答
反对 回复 2021-09-25
?
精慕HU

TA贡献1845条经验 获得超8个赞

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

indices = [i for i, x in enumerate(down ) if x == "b"]

curr=0

master_list=[]

for item in indices:

    master_list.append(down[curr:item+1])

    print(master_list)

    curr=item+1

if curr !=len(down):

    master_list.append(down[curr:len(down)])

print(master_list)


查看完整回答
反对 回复 2021-09-25
  • 5 回答
  • 0 关注
  • 236 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号