Python根据列表中的索引在列表中创建新列表

时间:2019-11-28 01:10:23

标签: python string list

如果我有列表

a = ['1 2 3 4 5', '1 2 3 4 etc', '1 etc etc', '2 5 6 8', '2 7 3 9', '2 etc etc']

我希望能够根据每个元素的开始对此进行排序。所以我想要的输出是:

a = [['1 2 3 4 5', '1 2 3 4 etc', '1 etc etc'], ['2 5 6 8', '2 7 3 9', '2 etc etc']]

但是事实是,对于我的真实代码,我不知道有很多以'1'或'2'开头的字符串,因此我无法基于固定值对列表进行分割,是有没有一种方法可以比较每个元素并在它们相同的情况下进行组合?

2 个答案:

答案 0 :(得分:4)

您可以将itertools.groupby()与列表理解结合使用:

>>> import itertools
>>> a = ['1 2 3 4 5', '1 2 3 4 etc', '1 etc etc', '2 5 6 8', '2 7 3 9', '2 etc etc']
>>> [list(x[1]) for x in itertools.groupby(a, lambda i: i.split(" ")[0])]
[['1 2 3 4 5', '1 2 3 4 etc', '1 etc etc'], ['2 5 6 8', '2 7 3 9', '2 etc etc']]

请注意,.groupby()需要对可迭代对象(即a)进行排序,因此,如果实际数据看起来不同,则可能必须先对其进行排序。

答案 1 :(得分:-1)

此方法无需使用任何程序包,并且与第0个元素可能是的对象类型无关:

a = ['1 2 3 4 5', '1 2 3 4 etc', '1 etc etc', '2 5 6 8', '2 7 3 9', '2 etc etc']

already_sorted = []
new_a = []

for i in range(0, len(a)):
    if i in already_sorted:
        continue
    else:
        tmp = []
        for j in range(0, len(a)):

            if a[i][0] == a[j][0] and j not in already_sorted:
                tmp.append(a[j])
                already_sorted.append(j)

        new_a.append(tmp)

print(new_a)

输出:

[['1 2 3 4 5', '1 2 3 4 etc', '1 etc etc'], ['2 5 6 8', '2 7 3 9', '2 etc etc']]