我需要帮助编写一个函数,该函数将获取单个列表并返回一个不同的列表,其中列表中的每个元素都在其自己的原始列表中。
我知道我必须遍历我传递的原始列表,然后根据值是否已经在我的列表中来附加值,或者创建子列表并将该子列表添加到最终列表。
一个例子是:
input:[1, 2, 2, 2, 3, 1, 1, 3]
Output:[[1,1,1], [2,2,2], [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]]