python - 如何按特定项目剪切列表?
问题描述
我正在尝试按其中的特定项目剪切列表,例如,我有一个这样的列表:
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'
我不知道出了什么问题。
解决方案
您收到错误是因为您将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
因此它的性能更差,然后只需迭代一次列表。
推荐阅读
- python - 在 Python 中中断 for 循环而不重置其索引
- excel - 如何重新调整/保留我的数组以防止运行时错误 9
- javascript - 从 file2.js 文件的 func2 调用 file1.js 的函数 func1,并且 func1 使用在 file1.js 中声明的全局变量
- sql - 为什么当字段为空时使用 to_char 函数会给我错误结果?
- google-chrome-extension - 关于如何从多个网页中抓取的思考
- python - 在py中打印决策树
- github - 将 GitHub 操作与自托管运行器一起使用,我可以使用仅在本地可用的 docker 映像吗?
- java - 如何分别获得尾数和指数值
- react-native - 在屏幕之间导航时出现奇怪的白色半屏反应导航
- shell - 如何检查字符是否跟随文本文件中的字符串?