根据特定元素拆分列表
Splitting a list based on specific element
我正在尝试根据元素 '|'
中的任何内容都将被视为新子列表的元素的条件将我的列表拆分为子列表。我忽略了任何带有空字符串的元素,因此它们不会包含在最终列表中。我有以下列表:
slist = ['|', 'a', 'b', 'c', '|', '', '|', 'd', 'e', '|']
结果将是:
[['a', 'b', 'c'], ['d', 'e']]
我写了下面的代码,谁能告诉我如何解决这个问题:
start = 0; end = 0
nlist = []
for s in range(0, len(slist)-1):
ns = s + 1
if slist[s] == '|' and ns == '|':
end = s - 1
elif slist[s] == '|':
start = s + 1
nlist.append(nlist[start:end])
一种可能的解决方案:
slist = ['|', 'a', 'b', 'c', '|', '', '|', 'd', 'e', '|']
inList = False
res = []
subl = []
for e in slist:
if not inList and e == '|':
# Only to find the start.
inList = True
elif inList:
if e == '|':
if len(subl) > 0:
# Append only if subl is not empty
res.append(subl)
subl = []
elif e:
# Append only non empty elements
subl.append(e)
结果:
[['a', 'b', 'c'], ['d', 'e']]
除非您真的需要某些东西的索引,否则在 Python 中您应该直接遍历元素。然后它只是几个 if
-s,决定如何处理当前元素:
slist = ['|', 'a', 'b', 'c', '|', '', '|', 'd', 'e', '|']
nlist = [[]]
for x in slist:
if x != "": # ignore empty
if x == "|":
nlist.append([]) # add a new sub-list
else:
nlist[-1].append(x) # or append the element to the current one
此时nlist
已经空sub-lists:
[[], ['a', 'b', 'c'], [], ['d', 'e'], []]
您可以通过简单的列表理解过滤掉哪些:
[l for l in nlist if len(l) != 0]
产出
[['a', 'b', 'c'], ['d', 'e']]
@simre 提倡的 split/join 技术适用于问题中显示的数据。这是一个 loop-based 可能更灵活的方法:
slist = ['|', 'a', 'b', 'c', '|', '', '|', 'd', 'e', '|']
result = []
e = []
for v in slist:
if v == '|':
if e:
result.append(e)
e = []
elif v:
e.append(v)
print(result)
输出:
[['a', 'b', 'c'], ['d', 'e']]
这也适用于列表中的字符串由多个字符组成的情况。隐式依赖列表中的最后一个元素等于“|”。
slist = ['|', 'a', 'b', 'c', '|', '', '|', 'd', 'e', '|']
relevant =[ i for i , x in enumerate(slist) if x =='|']
i=0
new=[[]]
while(len(slist)>0 and i!=len(relevant)):
x=slist[relevant[i]+1:relevant[i+1]]
new[0].append(x)
i=i+2
print(new)
Another way
我正在尝试根据元素 '|'
中的任何内容都将被视为新子列表的元素的条件将我的列表拆分为子列表。我忽略了任何带有空字符串的元素,因此它们不会包含在最终列表中。我有以下列表:
slist = ['|', 'a', 'b', 'c', '|', '', '|', 'd', 'e', '|']
结果将是:
[['a', 'b', 'c'], ['d', 'e']]
我写了下面的代码,谁能告诉我如何解决这个问题:
start = 0; end = 0
nlist = []
for s in range(0, len(slist)-1):
ns = s + 1
if slist[s] == '|' and ns == '|':
end = s - 1
elif slist[s] == '|':
start = s + 1
nlist.append(nlist[start:end])
一种可能的解决方案:
slist = ['|', 'a', 'b', 'c', '|', '', '|', 'd', 'e', '|']
inList = False
res = []
subl = []
for e in slist:
if not inList and e == '|':
# Only to find the start.
inList = True
elif inList:
if e == '|':
if len(subl) > 0:
# Append only if subl is not empty
res.append(subl)
subl = []
elif e:
# Append only non empty elements
subl.append(e)
结果:
[['a', 'b', 'c'], ['d', 'e']]
除非您真的需要某些东西的索引,否则在 Python 中您应该直接遍历元素。然后它只是几个 if
-s,决定如何处理当前元素:
slist = ['|', 'a', 'b', 'c', '|', '', '|', 'd', 'e', '|']
nlist = [[]]
for x in slist:
if x != "": # ignore empty
if x == "|":
nlist.append([]) # add a new sub-list
else:
nlist[-1].append(x) # or append the element to the current one
此时nlist
已经空sub-lists:
[[], ['a', 'b', 'c'], [], ['d', 'e'], []]
您可以通过简单的列表理解过滤掉哪些:
[l for l in nlist if len(l) != 0]
产出
[['a', 'b', 'c'], ['d', 'e']]
@simre 提倡的 split/join 技术适用于问题中显示的数据。这是一个 loop-based 可能更灵活的方法:
slist = ['|', 'a', 'b', 'c', '|', '', '|', 'd', 'e', '|']
result = []
e = []
for v in slist:
if v == '|':
if e:
result.append(e)
e = []
elif v:
e.append(v)
print(result)
输出:
[['a', 'b', 'c'], ['d', 'e']]
这也适用于列表中的字符串由多个字符组成的情况。隐式依赖列表中的最后一个元素等于“|”。
slist = ['|', 'a', 'b', 'c', '|', '', '|', 'd', 'e', '|']
relevant =[ i for i , x in enumerate(slist) if x =='|']
i=0
new=[[]]
while(len(slist)>0 and i!=len(relevant)):
x=slist[relevant[i]+1:relevant[i+1]]
new[0].append(x)
i=i+2
print(new)
Another way