我是Python新手,我遇到了解决下面问题的问题。
我有一个列表:
my_list = ['testOne:100', 'testTwo:88', 'testThree:76', 'testOne:78', 'testTwo:88', 'testOne:73', 'testTwo:66', 'testThree:90']
我想根据以'testOne'开头的元素的出现来对元素进行分组。
预期结果:
new_list=[['testOne:100', 'testTwo:88', 'testThree:76'], ['testOne:78', 'testTwo:88'], ['testOne:73', 'testTwo:66', 'testThree:90']]
答案 0 :(得分:3)
只需在每个testOne
开始一个新列表。
>>> new_list = []
>>> for item in my_list:
if item.startswith('testOne:'):
new_list.append([])
new_list[-1].append(item)
>>> new_list
[['testOne:100', 'testTwo:88', 'testThree:76'], ['testOne:78', 'testTwo:88'], ['testOne:73', 'testTwo:66', 'testThree:90']]
答案 1 :(得分:2)
不是很酷的单行,但这也适用于更通用的标签:
result = [[]]
seen = set()
for entry in my_list:
test, val = entry.split(":")
if test in seen:
result.append([entry])
seen = {test}
else:
result[-1].append(entry)
seen.add(test)
在这里,我们会跟踪我们已经在set
中看到的测试标签,并在遇到我们已在同一列表中看到的标签时开始新的列表。
或者,假设列表总是以testOne
开头,只要标签为testOne
,您就可以开始新的列表:
result = []
for entry in my_list:
test, val = entry.split(":")
if test == "testOne":
result.append([entry])
else:
result[-1].append(entry)
答案 2 :(得分:2)
有一个简单的衬垫很好,但我认为如果我尝试的话,它看起来有点太复杂了。这就是我想出的:
# Create a list of the starting indices:
ind = [i for i, e in enumerate(my_list) if e.split(':')[0] == 'testOne']
# Create a list of slices using pairs of indices:
new_list = [my_list[i:j] for (i, j) in zip(ind, ind[1:] + [None])]
答案 3 :(得分:0)
不是很复杂但它有效:
my_list = ['testOne:100', 'testTwo:88', 'testThree:76', 'testOne:78', 'testTwo:88', 'testOne:73', 'testTwo:66', 'testThree:90']
splitting_word = 'testOne'
new_list = list()
partial_list = list()
for item in my_list:
if item.startswith(splitting_word) and partial_list:
new_list.append(partial_list)
partial_list = list()
partial_list.append(item)
new_list.append(partial_list)
答案 4 :(得分:-1)
将列表加入带分隔符|
step1="|".join(my_list)
根据'testOne'
step2=step1.split("testOne")
将"testOne"
附加到列表元素以获取结果
new_list=[[i for i in str('testOne'+i).split("|") if len(i)>0] for i in step2[1:]]