基于值的重复对列表的元素进行分组

时间:2017-07-12 21:47:45

标签: python

我是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']]

5 个答案:

答案 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:]]