5 回答

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

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'))]

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)
添加回答
举报