例子:
delimiter = "x"
input = ["x","a","x","x",1,2,3,"a","a","x","e"]
output = [["x","a"], ["x"], ["x",1,2,3,"a","a"], ["x","e"]]
Run Code Online (Sandbox Code Playgroud)
步骤 1:查找variable
列表中出现的索引:
idx = [ix for ix, val in enumerate(input) if val==variable]
Run Code Online (Sandbox Code Playgroud)
第 2 步:使用列表切片生成子列表:
res = [input[i:j] for i,j in zip(idx, idx[1:]+[len(input)])]
Run Code Online (Sandbox Code Playgroud)
输出
print(res)
# [['x', 'a'], ['x'], ['x', 1, 2, 3, 'a', 'a'], ['x', 'e']]
Run Code Online (Sandbox Code Playgroud)
input
是一个Python方法,不要将其用作变量名[\'a\', \'b\', \'c\', \'x\', \'a\', \'x\', \'x\', 1, 2, 3, \'a\', \'a\', \'x\', \'e\', \'x\']
[[\'a\', \'b\', \'c\'], [\'x\', \'a\'], [\'x\'], [\'x\', 1, 2, 3, \'a\', \'a\'], [\'x\', \'e\'], [\'x\']]
from typing import List # for type annotations\n\n\ndef sublist_by_delimiter(flat_list: list, delimiter: str) -> List[list]:\n result = list() # main list\n chunk = list() # inner list to \n len_flat_list = len(flat_list)\n for i, v in enumerate(flat_list, 1): # iterate through t, begin enumerating at 1\n if (v == delimiter) & (i != 1): # except for the first delimiter \n result.append(chunk) # append chunk to result\n chunk = [v] # create new chunk beginning with v\n if i == len_flat_list: # if the last value in the list is delimiter\n result.append(chunk)\n elif (i == len_flat_list): # for the last list in lines\n chunk.append(v) # append that line to inner\n result.append(chunk) # append chunk to result\n else:\n chunk.append(v) # append each v to chunk where v isn\'t delimiter\n \n return result\n \n\nt = [\'x\', \'a\', \'x\', \'x\', 1, 2, 3, \'a\', \'a\', \'x\', \'e\', \'x\'] # an extra x has been added at the end for testing\ndelim = \'x\'\nsublist_by_delimiter(t, delim)\n[[\'x\', \'a\'], [\'x\'], [\'x\', 1, 2, 3, \'a\', \'a\'], [\'x\', \'e\'], [\'x\']]\n
Run Code Online (Sandbox Code Playgroud)\ncollections.defaultdict
dicts
保证根据插入进行排序,因此dict.values()
返回时将进行排序。return list(dd.values())
return dd
[\'a\', \'b\', \'c\', \'x\', \'a\', \'x\', \'x\', 1, 2, 3, \'a\', \'a\', \'x\', \'e\', \'x\']
[[\'a\', \'b\', \'c\'], [\'x\', \'a\'], [\'x\'], [\'x\', 1, 2, 3, \'a\', \'a\'], [\'x\', \'e\'], [\'x\']]
from collection import defaultdict\n\ndef sublist_by_delimiter(flat_list: list, delimiter: str) -> List[list]:\n dd = defaultdict(list)\n counter = 0\n for v in flat_list:\n if v == delimiter:\n counter += 1\n dd[counter].append(v)\n else:\n dd[counter].append(v)\n return list(dd.values())\n\n\nsublist_by_delimiter(t, \'x\')\n[[\'x\', \'a\'], [\'x\'], [\'x\', 1, 2, 3, \'a\', \'a\'], [\'x\', \'e\'], [\'x\']]\n
Run Code Online (Sandbox Code Playgroud)\ndict
3.61 s \xc2\xb1 9.85 ms per loop (mean \xc2\xb1 std. dev. of 7 runs, 1 loop each)
对于 25M 元素列表\ndefaultdict
:3.74 s \xc2\xb1 53.7 ms
KeyError
如前所述,如果第一个字符不是分隔符,则此解决方案将产生 a 。def sublist_by_delimiter(flat_list: list, delimiter: str) -> List[list]:\n dd = dict(list)\n counter = 0\n for v in flat_list:\n if v == delimiter:\n counter += 1\n if dd.get(counter) == None:\n dd[counter] = [v]\n else:\n dd[counter].append(v)\n return list(dd.values())\n
Run Code Online (Sandbox Code Playgroud)\n
归档时间: |
|
查看次数: |
330 次 |
最近记录: |