根据python中的条件创建列表以创建唯一列表

时间:2018-11-29 14:10:08

标签: python algorithm list

我有两个列表:

a= [0,0,0,1,1,1,3,3,3]
b= ['a','b','c','d','e','f','g','h','i']
output = [['a','b','c'],['d','e','f'],['g','h','i']]

a和b是相同长度的列表。 我需要一个输出数组,只要列表中的值-从0更改为1或从1更改为3,就应该在输出列表中创建一个新列表。 有人可以帮忙吗?

4 个答案:

答案 0 :(得分:4)

使用groupby

from itertools import groupby
from operator import itemgetter

a = [0, 0, 0, 1, 1, 1, 3, 3, 3]
b = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']

output = [list(map(itemgetter(1), group)) for _, group in groupby(zip(a, b), key=itemgetter(0))]
print(output)

输出

[['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i']]

答案 1 :(得分:2)

使用groupby,您可以这样做:

from itertools import groupby

a= [0,0,0,1,1,1,3,3,3]
b= ['a','b','c','d','e','f','g','h','i']

iter_b = iter(b)
output = [[next(iter_b) for _ in group] for key, group in groupby(a)]

print(output)
# [['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i']]

groupby产生a相同值的连续组。对于每个组,我们创建一个列表,其中包含与该组中的值一样多的b下一个元素。

答案 2 :(得分:2)

一种更简单的方法,无需通过字典使用任何导入:

a= [0,0,0,1,1,1,3,3,3]
b= ['a','b','c','d','e','f','g','h','i']

d = {e: [] for e in set(a)} # Create a dictionary for each of a's unique key
[d[e].append(b[i]) for i, e in enumerate(a)] # put stuff into lists by index
lofl = list(d.values())

>>> lofl
[['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i']]

答案 3 :(得分:1)

当您添加标签 algorithm 时,我相信您想要一个没有那么多魔术的解决方案。

>>> def merge_lists(A, B):
...     output = []
...     sub_list = []
...     current = A[0]
...     for i in range(len(A)):
...         if A[i] == current:
...             sub_list.append(B[i])
...         else:
...             output.append(sub_list)
...             sub_list = []
...             sub_list.append(B[i])
...             current = A[i]
...     output.append(sub_list)
...     return output
... 
>>> a= [0,0,0,1,1,1,3,3,3]
>>> b= ['a','b','c','d','e','f','g','h','i']
>>> merge_list(a, b)
[['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i']]