我有一个字符串列表:
['splitter001','stringA','stringB','splitter_1234','stringC']
我希望我的最终结果是:
[ ['splitter001','stringA','stringB'] , ['splitter_1234','stringC'] ]
分离器分频器不是相同的弦。
如果元素索引>我试图找到'拆分器'。 0,然后删除索引[:2nd splitter]并将第一个组附加到新列表中,但这不能正常工作。
我在所有字符串上迭代for循环,但它不适用于第二组,所以我可以得到:
[ ['splitter001','stringA','stringB'] ] as my new list, but the second group is missing.
我已经阅读了很多关于这个主题的答案,最接近的解决方案就是使用:
[list(x[1]) for x in itertools.groupby(myList, lambda x: x=='#') if not x[0]]
但我不明白这种语法...我读过groupby和intertools,但我不确定这对我的情况有帮助。
答案 0 :(得分:3)
以下是使用groupby
执行此操作的一种方法。我们告诉groupby
查找以“splitter”开头的字符串。这会创建两种组:以“splitter”开头的字符串和所有其他字符串。例如,
from itertools import groupby
data = ['splitter001','stringA','stringB','splitter_1234','stringC']
for k, g in groupby(data, key=lambda s: s.startswith('splitter')):
print(k, list(g))
<强>输出强>
True ['splitter001']
False ['stringA', 'stringB']
True ['splitter_1234']
False ['stringC']
因此我们可以将这些组放入两个列表中,然后将它们压缩在一起以制作最终列表。
from itertools import groupby
data = ['splitter001','stringA','stringB','splitter_1234','stringC']
head = []
tail = []
for k, g in groupby(data, key=lambda s: s.startswith('splitter')):
if k:
head.append(list(g))
else:
tail.append(list(g))
out = [u+v for u, v in zip(head, tail)]
print(out)
<强>输出强>
[['splitter001', 'stringA', 'stringB'], ['splitter_1234', 'stringC']]
这是一种更紧凑的方式来做同样的事情,使用列表列表来存储头尾列表:
from itertools import groupby
data = ['splitter001','stringA','stringB','splitter_1234','stringC']
results = [[], []]
for k, g in groupby(data, key=lambda s: s.startswith('splitter')):
results[k].append(list(g))
out = [v+u for u, v in zip(*results)]
print(out)
<强>输出强>
[['splitter001', 'stringA', 'stringB'], ['splitter_1234', 'stringC']]
如果您想在单独的行上打印每个子列表,那么简单的方法是使用for
循环而不是创建out
列表。
for u, v in zip(*results):
print(v + u)
<强>输出强>
['splitter001', 'stringA', 'stringB']
['splitter_1234', 'stringC']
另一种方法是将子列表转换为字符串,然后将它们与换行符连接在一起以创建一个大字符串。
print('\n'.join([str(v + u) for u, v in zip(*results)]))
此最终变体将两种类存储到单个迭代器对象中。我想您会同意以前的版本更容易阅读。 :)
it = iter(list(g) for k, g in groupby(data, key=lambda s: s.startswith('splitter')))
out = [u+v for u, v in zip(it, it)]
答案 1 :(得分:2)
获取class Parent {
constructor() {
this.autoPlay();
}
autoPlay() {
}
}
class Child extends Parent {
autoPlay() {
console.log('Child');
}
}
const child = new Child();
元素的索引,然后在那些索引处对列表进行切片
startswith('splitter')
答案 2 :(得分:1)
这是一种使用for
循环的方法,如您所提到的那样,处理第二组的情况:
# define list of strings for input
strings = ['splitter001','stringA','stringB','splitter_1234','stringC']
split_strings = [] # this is going to hold the final output
current_list = [] # this is a temporary list
# loop over strings in the input
for s in strings:
if 'splitter' in s:
# if current_list is not empty
if current_list:
split_strings.append(current_list) # append to output
current_list = [] # reset current_list
current_list.append(s)
# outside of the loop, append the leftover strings (if any)
if current_list:
split_strings.append(current_list)
这里的关键是你在循环之外再做一次追加来捕获最后一组。
输出:
[['splitter001', 'stringA', 'stringB'], ['splitter_1234', 'stringC']]
编辑:添加代码说明。
我们创建一个临时变量current_list
来保存我们将附加到最终输出split_strings
的每个列表。
循环输入中的字符串。对于每个字符串s
,请检查它是否包含'splitter'
。如果它确实并且current_list
不为空,这意味着我们已经击中了下一个分隔符。将current_list
附加到输出并清除它,以便我们可以开始收集下一组字符串的项目。
完成此检查后,将当前字符串追加到current_list
。这是有效的,因为我们在找到分隔符后将其清除(将其设置为[]
)。
在列表的末尾,我们将剩余的东西附加到输出中,如果有的话。
答案 3 :(得分:1)
您可以尝试这样的事情:
在from to
出现时首先获取splitter
索引号,然后根据这些索引查看列表:
sl = ['splitter001','stringA','stringB','splitter_1234','stringC']
si = [index for index, value in enumerate(sl) if value.startswith('splitter')]
for i in range(0,len(si),1):
slice=si[i:i+2]
if len(slice)==2:
print(sl[slice[0]:slice[1]])
else:
print(sl[slice[0]:])
输出:
['splitter001', 'stringA', 'stringB']
['splitter_1234', 'stringC']