返回列表元素列表

时间:2014-10-21 20:39:14

标签: python list python-3.x append

我需要帮助编写一个函数,该函数将获取单个列表并返回一个不同的列表,其中列表中的每个元素都在其自己的原始列表中。

我知道我必须遍历我传递的原始列表,然后根据值是否已经在我的列表中来附加值,或者创建子列表并将该子列表添加到最终列表。

一个例子是:

input:[1, 2, 2, 2, 3, 1, 1, 3]

Output:[[1,1,1], [2,2,2], [3,3]]

3 个答案:

答案 0 :(得分:2)

最有效的方法是使用字典:

collector = {}
for elem in inputlist:
    collector.setdefault(elem, []).append(elem)

output = collector.values()

另一个更昂贵的选择是排序,然后使用itertools.groupby()进行分组:

from itertools import groupby

output = [list(g) for k, g in groupby(sorted(inputlist))]

演示:

>>> inputlist = [1, 2, 2, 2, 3, 1, 1, 3]
>>> collector = {}
>>> for elem in inputlist:
...     collector.setdefault(elem, []).append(elem)
... 
>>> collector.values()
[[1, 1, 1], [2, 2, 2], [3, 3]]
>>> from itertools import groupby
>>> [list(g) for k, g in groupby(sorted(inputlist))]
[[1, 1, 1], [2, 2, 2], [3, 3]]

答案 1 :(得分:2)

我分两步完成:

>>> import collections
>>> inputs = [1, 2, 2, 2, 3, 1, 1, 3]
>>> counts = collections.Counter(inputs)
>>> counts
Counter({1: 3, 2: 3, 3: 2})
>>> outputs = [[key] * count for key, count in counts.items()]
>>> outputs
[[1, 1, 1], [2, 2, 2], [3, 3]]

(事实上,这些恰好是按照排序的数字顺序,也是按照第一次出现的顺序,这只是巧合。计数器,像普通字典一样,以任意顺序存储它们的键,你应该假设{结果将是{1}}。如果这是不可接受的,那么你需要做更多的工作。)


那么,它是如何运作的?

第一步创建一个Counter,它只是[[3, 3], [1, 1, 1], [2, 2, 2]]的一个特殊子类,用于计算每个键的出现次数。关于它的许多漂亮的事情之一是你可以将它传递给任何可迭代的(如dict)并且它将计算每个元素出现的次数。这是一个简单的单行,一旦你知道list是如何工作的,它是显而易见的,并且它甚至可以像任何可能的那样高效。*

但这不是您想要的输出格式。我们怎么做到的?好吧,我们必须从Counter(意为“1: 3”的3份副本)回到1)。你可以把它写成[1, 1, 1]。**其余的只是一个标准的列表理解。


如果您查看[key] * count模块的文档,则会以the source的链接开头。 stdlib中的许多模块都是这样的,因为它们可以作为学习源代码以及可用代码。因此,您应该能够弄清楚collections构造函数的工作原理。 (它基本上只是调用Counter函数。)因为这是_count_elements的唯一部分,你实际上在基本的Counter之外使用,你可以自己编写那部分。 (但实际上,一旦你理解了它是如何工作的,没有充分的理由不使用它,对吧?)


*对于每个元素,它只是进行哈希表查找(并在需要时插入)和dict。在CPython中,这一切都发生在reasonably-optimized C

**请注意,我们不必担心这里是否使用+= 1[key] * count,因为值必须是不可变的,或者至少是“相等”与身份“类型一样好,或者它们不能用作密钥。

答案 2 :(得分:0)

如你所说,你想要一个功能呢?

def makeList(user_list):
    user_list.sort()
    x = user_list[0]
    output = [[]]
    for i in user_list:
        if i == x:
            output[-1].append(i)
        else:
            output.append([i])
        x = i

    return output

>>> print makeList([1, 2, 2, 2, 3, 1, 1, 3])
[[1, 1, 1], [2, 2, 2], [3, 3]]