繁体   English   中英

如何将列表拆分为具有相同第一个值的嵌套列表?

[英]How to split list into nested lists with the same first value?

我有 python 列表(示例):

mylist = ["AA - AA", "qwerty", "123456789", "nvidia", "fan", "8765", "AA - AA", "group", "bread", "plate", "knife", "AA - AA", "123123123", "laptop", "666"]

(我的真实列表包含大约 2000 个元素,您在上面看到的只是一个简短的示例。)

我需要将该列表拆分为:

newlist = [["AA - AA", "qwerty", "123456789", "nvidia", "fan", "8765"], ["AA - AA", "group", "bread", "plate", "knife"], ["AA - AA", "123123123", "laptop", "666"]]

如您所见,每个嵌套列表都有不同数量的元素和相同的第一个元素“AA - AA”。

如何将列表拆分为嵌套列表,使其具有第一个元素“AA - AA”和最后一个元素(下一个“AA - AA”之前的元素)?

python 有内置方法groupby

mylist = ["AA - AA", "qwerty", "123456789", "nvidia", "fan", "8765", "AA - AA", "group", "bread", "plate", "knife", "AA - AA", "123123123", "laptop", "666"]

from itertools import groupby
x = (list(g) for _, g in groupby(mylist, key='AA - AA'.__eq__))
[i+j for i, j in zip(x, x)]

# OUPUT is:
# [['AA - AA', 'qwerty', '123456789', 'nvidia', 'fan', '8765'], ['AA - AA', 'group', 'bread', 'plate', 'knife'], ['AA - AA', '123123123', 'laptop', '666']]

假设mylist中的第一个元素是 'AA - AA' 那么:

mylist = ["AA - AA", "qwerty", "123456789", "nvidia", "fan", "8765", "AA - AA", "group", "bread", "plate", "knife", "AA - AA", "123123123", "laptop", "666"]

result = []

for e in mylist:
    if e == 'AA - AA':
        result.append([e])
    else:
        result[-1].append(e)

print(result)

Output:

[['AA - AA', 'qwerty', '123456789', 'nvidia', 'fan', '8765'], ['AA - AA', 'group', 'bread', 'plate', 'knife'], ['AA - AA', '123123123', 'laptop', '666']]

笔记:

对于如此微不足道的事情,当然不需要 itertools、numpy 或临时/中间变量

您可以尝试以下方法。 它假定mylist'AA - AA'开头。

mylist = ["AA - AA", "qwerty", "123456789", "nvidia", "fan", "8765", "AA - AA", "group", "bread", "plate", "knife", "AA - AA", "123123123", "laptop", "666"]

output = []
temp = [] # redundant, but omitting it angers type checkers
for x in mylist:
    if x == 'AA - AA':
        output.append(temp := [x])
    else:
        temp.append(x)

print(output)
# [['AA - AA', 'qwerty', '123456789', 'nvidia', 'fan', '8765'],
#  ['AA - AA', 'group', 'bread', 'plate', 'knife'],
#  ['AA - AA', '123123123', 'laptop', '666']]

对于 python 3.8,海象运算符:=不存在。 然后您可以将output.append(temp:= [x])替换为

temp = [x]
output.append(temp)

尝试:

import numpy as np

mylist, lst = ["AA - AA", "qwerty", "123456789", "nvidia", "fan", "8765", "AA - AA", "group", "bread", "plate", "knife", "AA - AA", "123123123", "laptop", "666"], []
where = np.where(np.array(mylist + ["AA - AA"]) == "AA - AA")[0]
for i in range(len(where)-1):   lst.append(mylist[where[i]:where[i+1]-1])
print(lst)

结果:

[['AA - AA', 'qwerty', '123456789', 'nvidia', 'fan'],
 ['AA - AA', 'group', 'bread', 'plate'],
 ['AA - AA', '123123123', 'laptop']]

我想提出第三种单线解决方案:

[mylist[idx:idx1] for idx, idx1 in zip([i for i,item in enumerate(mylist) if item=='AA - AA'][:-1],[i for i,item in enumerate(mylist) if item=='AA - AA'][1:])]

解释:

[i for i,item in enumerate(mylist) if item=='AA - AA']

返回'AA - AA'键的所有索引位置。 由于我们要提取键的相邻出现之间的mylist的值,因此我创建了一个列表,该列表使用[1:]移动了一个因此,没有Index ot of range 也许这个问题有更优雅的解决方案

最后一步是并行迭代两个列表并构建列表。

mylist = ["AA - AA", "qwerty", "123456789", "nvidia", "fan", "8765", "AA - AA", "group", "bread", "plate", "knife", "AA - AA", "123123123", "laptop", "666"]

ranges = [i for i, j in enumerate(mylist) if j == 'AA - AA'] + [len(mylist)]
output = [[mylist[ranges[x]:ranges[x+1]]] for x in range(len(ranges)-1)]

Output:

[[['AA - AA', 'qwerty', '123456789', 'nvidia', 'fan', '8765']], [['AA - AA', 'group', 'bread', 'plate', 'knife']], [['AA - AA', '123123123', 'laptop', '666']]]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM