[英]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.