2

サブリスト要素の一意のインスタンスの数を数え、次に、サブリストに追加されたインスタンスの数を使用して、各一意の要素を新しいリストに書き込もうとしています。list_1の各サブリストには2つの要素しかなく、順序は重要ではありません。

それで:

list_1 = [[a, b], [a, c], [a, c], [a, c], [b, e], [d, q], [d, q]]

になります:

new_list =  [[a, b, 1], [a, c, 3], [b, e, 1], [d, q, 2]]

セットを使う必要があると思いますが、正しい方向に向けてくれた人に感謝します。

4

3 に答える 3

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()]

これにより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]]

発生が常に連続している場合は、次を使用することもできます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)]

ここでは別のジェネレーター関数を使用しましたが、ループをリスト内包表記にインライン化できます。

これは与える:

>>> 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]]

元の順序を保持します。

于 2013-03-02T16:40:22.057 に答える
1

同一のサブリストが連続している場合:

from itertools import groupby

new_list = [sublist + [sum(1 for _ in g)] for sublist, g in groupby(list_1)]
# -> [['a', 'b', 1], ['a', 'c', 3], ['b', 'e', 1], ['d', 'q', 2]]
于 2013-03-02T16:50:22.907 に答える
0

少し「家の中を回る」ソリューション

list_1 = [['a', 'b'], ['a', 'c'], ['a', 'c'], ['a', 'c'], ['b', 'e'], ['d', 'q'], ['d', 'q']]
new_dict={}
new_list=[]
for l in list_1:
    if tuple(l) in new_dict:
        new_dict[tuple(l)] += 1
    else:
        new_dict[tuple(l)] = 1
for key in new_dict:
    entry = list(key)
    entry.append(new_dict[key])
    new_list.append(entry)
print new_list
于 2013-03-02T16:45:38.727 に答える