在python中计算和追加子列表元素

spa*_*tin 2 python sublist

我正在尝试计算子列表元素的唯一实例的数量,然后将每个唯一元素写入新列表,并将实例数附加到子列表.list_1中的每个子列表只有两个元素,顺序无关紧要.

所以:

list_1 = [[a, b], [a, c], [a, c], [a, c], [b, e], [d, q], [d, q]]
Run Code Online (Sandbox Code Playgroud)

变为:

new_list =  [[a, b, 1], [a, c, 3], [b, e, 1], [d, q, 2]]
Run Code Online (Sandbox Code Playgroud)

我想我需要使用套装,但我感谢任何指点我正确方向的人.

Mar*_*ers 6

你想看看collections.Counter(); Counter物体是多组的(也称为袋子); 他们将键映射到他们的计数.

不得不把你的子表到元组是可作为钥匙,但:

from collections import Counter

counts = Counter(tuple(e) for e in list_1)

new_list = [list(e) + [count] for e, count in counts.most_common()]
Run Code Online (Sandbox Code Playgroud)

它为您提供new_list按计数排序(降序):

>>> from collections import Counter
>>> list_1 = [['a', 'b'], ['a', 'c'], ['a', 'c'], ['a', 'c'], ['b', 'e'], ['d', 'q'], ['d', 'q']]
>>> counts = Counter(tuple(e) for e in list_1)
>>> [list(e) + [count] for e, count in counts.most_common()]
[['a', 'c', 3], ['d', 'q', 2], ['a', 'b', 1], ['b', 'e', 1]]
Run Code Online (Sandbox Code Playgroud)

如果您的出现总是连续的,那么您还可以使用itertools.groupby():

from itertools import groupby

def counted_groups(it):
    for entry, group in groupby(it, key=lambda x: x):
        yield entry + [sum(1 for _ in group)]

new_list = [entry for entry in counted_groups(list_1)]
Run Code Online (Sandbox Code Playgroud)

我在这里使用了一个单独的生成器函数,你可以将循环内联到列表理解中.

这给出了:

>>> from itertools import groupby
>>> def counted_groups(it):
...     for entry, group in groupby(it, key=lambda x: x):
...         yield entry + [sum(1 for _ in group)]
... 
>>> [entry for entry in counted_groups(list_1)]
[['a', 'b', 1], ['a', 'c', 3], ['b', 'e', 1], ['d', 'q', 2]]
Run Code Online (Sandbox Code Playgroud)

并保留原始订单.