如何在另一个列表中的不同大小的列表上获取元素?

时间:2019-04-27 16:25:29

标签: python

如何将所有元素放入不同大小的子列表中?

我在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

3 个答案:

答案 0 :(得分:2)

您需要zip_longestfillvalue处理空字符+一个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

此代码的问题是:

  1. 您正在遍历a_list,而您应该遍历索引(我使用最长子列表的范围)
  2. 之所以收到IndexError是因为您通过x[index]访问了子列表元素,而我使用的是x[index:index+1],它会返回一个列表(如果索引超出范围则为空)
  3. 我使用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()]