4

リスト内の同じような値を並べ替えてから、同じような値をサブリストに分割する方法を考えていました。

例:おそらく次のような関数が必要です

def sort_by_like_values(list):
    #python magic

>>>list=[2,2,3,4,4,10]
>>>[[2,2],[3],[4,4],[10]]
OR
>>>[2,2],[3],[4,4],[10]

並べ替えられたAPIを読みました。これは、独自のリスト内で物事を並べ替えるのに適していますが、リストをサブリストに分割しません。ここでどのモジュールが役に立ちますか?

4

5 に答える 5

5

groupbyitertoolsモジュールから使用します。

from itertools import groupby

L = [2, 2, 3, 4, 4, 10]

L.sort()
for key, iterator in groupby(L):
    print key, list(iterator)

結果:

2 [2、2]
3 [3]
4 [4、4]
10 [10]

注意すべき点がいくつかありgroupbyます。グループ化するのと同じキーでデータを並べ替える必要があります。そうしないと、機能しません。また、イテレータは次のグループに進む前に消費する必要があるため、必ずlist(iterator)別のリストなどに保存してください。あなたが望む結果をあなたに与えるワンライナー:

>>> [list(it) for key, it in groupby(sorted(L))]
[[2, 2], [3], [4, 4], [10]]
于 2012-07-21T20:59:08.057 に答える
2

itertoolsモジュールを確認してください。便利なgroupby機能があります。

import itertools as i
for k,g in i.groupby(sorted([2,2,3,4,4,10])):
    print list(g)

....

[2, 2]
[3]
[4, 4]
[10]

これを変更して、リスト内の値を取得できるはずです。

于 2012-07-21T20:59:43.103 に答える
2

他の誰もが示唆しているようitertools.groupbyに(これが私の最初の選択です)-collections.Counterキーと頻度を取得し、キーで並べ替えてから、頻度を元に戻すことも可能です。

from itertools import repeat
from collections import Counter

grouped = [list(repeat(key, freq)) for key, freq in sorted(Counter(L).iteritems())]
于 2012-07-21T21:21:18.663 に答える
1

itertoolsを使用したくない場合で、リスト内包表記に頭を悩ませることができる場合は、これでもうまくいくはずです。

def group(a):
    a = sorted(a)
    d = [0] + [x+1 for x in range(len(a)-1) if a[x]!=a[x+1]] + [len(a)]
    return [a[(d[x]):(d[x+1])] for x in range(len(d)-1)]

aあなたのリストはどこにありますか

于 2012-07-21T21:57:36.927 に答える
1

itertools.groupby()リスト内包表記を使用すると、正常に機能します。

In [20]: a = [1, 1, 2, 3, 3, 4, 5, 5, 5, 6]

In [21]: [ list(subgroup) for key, subgroup in itertools.groupby(sorted(a)) ]
Out[21]: [[1, 1], [2], [3, 3], [4], [5, 5, 5], [6]]

はイテレータのリストを返すことに注意してくださいgroupby()。これらのイテレータを順番に使用する必要があります。ドキュメントによると:

返されるグループ自体は、基になるイテレータをgroupby()と共有するイテレータです。ソースが共有されているため、groupby()オブジェクトが進められると、前のグループは表示されなくなります。したがって、そのデータが後で必要になった場合は、リストとして保存する必要があります。

于 2012-07-21T21:04:35.203 に答える