如何将所有元素放入不同大小的子列表中?
我在a_list内有子列表:
/**
* The default implementation of {@link AdminClient}.
* An instance of this class is created by invoking one of the
* {@code create()} methods in {@code AdminClient}.
* Users should not refer to this class directly.
我需要根据所有元素的索引对它们进行分组,并且如果子列表缺少元素,则需要忽略所有元素。
这是我需要的输出:
a_list = [['a', 'b'], ['a', 'b'], ['a']]
我尝试过:
['a', 'a', 'a']
['b', 'b'] # here's where I'm having problems
也尝试过:
for index, a in enumerate(a_list):
another_list = (list(zip(*a_list))[index]) # IndexError
答案 0 :(得分:2)
您需要zip_longest
和fillvalue
处理空字符+一个chain.from_iterable
来展平列表。
[list(chain.from_iterable(x)) for x in zip_longest(*a_list, fillvalue='')]
代码:
from itertools import chain, zip_longest
a_list = [['a', 'b'], ['a', 'b'], ['a']]
print([list(chain.from_iterable(x)) for x in zip_longest(*a_list, fillvalue='')])
# [['a', 'a', 'a'], ['b', 'b']]
答案 1 :(得分:2)
这应该有效:
a_list = [['a', 'b'], ['a', 'b'], ['a']]
r = len(max(a_list, key=len))
z = [sum([x[i:i+1] for x in a_list], []) for i in range(r)]
z
>>> [['a', 'a', 'a'], ['b', 'b']]
说明:
让我们考虑您的第二次尝试:
another_list = list()
for index, a in enumerate(a_list):
another_list.append([x[index] for x in a_list]) # IndexError
此代码的问题是:
a_list
,而您应该遍历索引(我使用最长子列表的范围)x[index]
访问了子列表元素,而我使用的是x[index:index+1]
,它会返回一个列表(如果索引超出范围则为空)sum(index_group, [])
来使组扁平化(请参见下面的代码)然后在我的代码中将所有这些内容合并到一个列表理解中,但是下面可以像您一样使用for
循环来找到等效的版本。
修改后的代码:
a_list = [['a', 'b'], ['a', 'b'], ['a']]
another_list = list()
for index in range(max([len(x) for x in a_list])): # loop over indexes
# create a list of sublist slices containing the index-th element
ind_group = [x[index:index+1] for x in a_list]
# flatten the list
flat_ind_group = sum(ind_group, [])
another_list.append(flat_ind_group)
another_list
>>> [['a', 'a', 'a'], ['b', 'b']]
答案 2 :(得分:1)
您可以先整理列表,然后使用Counter
模块对频率进行计数
from collections import Counter
a_list = [['a', 'b'], ['a', 'b'], ['a']]
a_list_flat = [i for sub in a_list for i in sub]
another_list = [[k for _ in range(v)] for k, v in Counter(a_list_flat).items()]
# [['a', 'a', 'a'], ['b', 'b']]
或者,
another_list = [[k]*v for k, v in Counter(a_list_flat).items()]