基于任意数量的索引将列表拆分为多个部分的最佳方法是什么?例如,给出下面的代码
indexes = [5, 12, 17]
list = range(20)
Run Code Online (Sandbox Code Playgroud)
返回这样的东西
part1 = list[:5]
part2 = list[5:12]
part3 = list[12:17]
part4 = list[17:]
Run Code Online (Sandbox Code Playgroud)
如果没有索引,则应返回整个列表.
是否有通过分隔元素将Python中的列表拆分为子列表的简洁而优雅的方法,例如['a', 'delim', 'b']- > [['a'], ['b']]?
这是一个例子:
ldat = ['a','b','c','a','b','c','a','b']
dlim = 'c'
lspl = [] # an elegant python one-liner wanted on this line!
print(lspl) # want: [['a', 'b'], ['a', 'b'], ['a', 'b']]
Run Code Online (Sandbox Code Playgroud)
我已经调查了关于stackoverflow的文档和相关问题 - 下面引用了很多 - 这些都没有回答我的问题,并且总结了我的研究如下:几种方法确实产生了所需的输出,但是冗长而错综复杂,以及发生了什么(分裂了列表)并不是很明显 - 你真的不得不眯着眼睛.
还有更好的方法吗?我主要关注初学者的可读性(例如教学),规范/'Pythonic'方法,其次是最有效的方法(例如,时间速度).理想情况下,答案将解决Python 2.7和3.x.
循环遍历列表并附加到最后一个输出列表或添加新的输出列表.基于包含分隔符的示例,但已更改为排除它.我不确定如何使它成为一个单行,或者如果这甚至是可取的.
lspl = [[]]
for i in ldat:
if i==dlim:
lspl.append([])
else:
lspl[-1].append(i)
print(lspl) # prints: [['a', 'b'], ['a', 'b'], ['a', 'b']]
Run Code Online (Sandbox Code Playgroud)
例子:
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)
我有很多单词:
my_list = ['[tag]', 'there', 'are', 'many', 'words', 'here', '[/tag]', '[tag]', 'some', 'more', 'here', '[/tag]', '[tag]', 'and', 'more', '[/tag]']
Run Code Online (Sandbox Code Playgroud)
我希望能够计算整个列表中[tag]元素之间(和包括)元素的数量.目标是能够看到频率分布.
我可以range()用来开始和停止字符串匹配吗?
每当出现特定字符或一组字符时,我试图将我拥有的列表拆分为单独的列表。
例如。
Main_list = [ 'abcd 1233','cdgfh3738','hryg21','**L**','gdyrhr657','abc31637','**R**','7473hrtfgf'...]
Run Code Online (Sandbox Code Playgroud)
每当遇到“L”或“R”时,我想打破这个列表并将其保存到子列表中
期望的结果:
sublist_1 = ['abcd 1233','cdgfh3738','hryg21']
sublist_2 = ['gdyrhr657','abc31637']
sublist 3 = ['7473hrtfgf'...]
Run Code Online (Sandbox Code Playgroud)
是否有内置函数或快速方法可以做到这一点?
编辑:我不希望分隔符出现在列表中
我有一个列表,我想将它分成几部分,就像str.split()字符串的作品一样,有以下不同之处:
True列表的元素,则此元素被视为分隔符.例如:
split_by_predicate([0, "One", 1, 2, 3,
"Two", 4, 5, 6, 7, "Three", "Four"],
predicate=lambda x: isinstance(x, str))
Run Code Online (Sandbox Code Playgroud)
应该给我
[[0], ["One", 1, 2, 3], ["Two", 4, 5, 6, 7], ["Three"], ["Four"]]
Run Code Online (Sandbox Code Playgroud)
我可以写下面的代码:
def split_by_predicate(it, predicate):
lst = []
cur = []
for element in it:
if predicate(element):
lst.append(cur)
cur = []
cur.append(element)
lst.append(cur)
return lst
Run Code Online (Sandbox Code Playgroud)
但我发现它不优雅而不是Pythonic.这里给出了类似的方法(使用生成器).
我试图找出itertools像这样的某种类型的解决方案,但是如果重复定界(例如我的例子),它们就不能很好地工作.
有没有想法如何以比我当前的代码更多的功能风格来做?
我是Python(3.6)的新手,并且正在努力理解itertools groupby.我有以下包含整数的列表:
list1 = [1, 2, 0, 2, 3, 0, 4, 5, 0]
Run Code Online (Sandbox Code Playgroud)
但是列表也可能更长,并且在每对数字之后不必出现'0'.它也可以是3,4或更多的数字.我的目标是将此列表拆分为子列表,其中"0"用作分隔符,并且不会出现在任何这些子列表中.
list2 = [[1, 2], [2, 3], [4, 5]]
Run Code Online (Sandbox Code Playgroud)
这里已经解决了类似的问题: Python基于分隔符单词分割列表 答案2似乎对我有很大的帮助但不幸的是它只给了我一个TypeError.
import itertools as it
list1 = [1, 2, 0, 2, 3, 0, 4, 5, 0]
list2 = [list(group) for key, group in it.groupby(list1, lambda x: x == 0) if not key]
print(list2)
Run Code Online (Sandbox Code Playgroud)
文件"H:/Python/work/ps0001/example.py",第13行,在list2 = [list(group)for key,group in it.groupby(list,lambda x:x =='0')if if not键]
TypeError:'list'对象不可调用
我很感激任何帮助,并很高兴终于了解groupby.
输入
['~', 'n1', 'n2', ..., 'nn', '~', 'k1', 'k2', ..., 'kn', '~']
Run Code Online (Sandbox Code Playgroud)
期望的输出:
[['n1', 'n2', ..., 'nn'],['k1', 'k2', ..., 'kn']]
Run Code Online (Sandbox Code Playgroud)
我见过itertools groupby但是无法让它工作.任何帮助,将不胜感激.另外......实际上并不在列表中,只是说中间有更多元素