0

このリストのアイテムを新しいリストに並べ替えたいのですが...

truc = [['12', 'brett', 5548],
       ['22.3', 'troy', 9514],
       ['8.1', 'hings', 12635],
       ['34.2', 'dab', 17666],
       ['4q3', 'sigma', 18065],
       ['4q3', 'delta', 18068]]

...最後のフィールドを使用してそれらをサイズ3500のビンにグループ化すると、理想的な結果は次のようになります。

firstSort = [['34.2', 'dab', 17666],
            ['4q3', 'sigma', 18065],
            ['4q3', 'delta', 18068]]

secondSort = [['22.3', 'troy', 9514],
             ['8.1', 'hings', 12635]]

lastSort = ['12', 'brett', 5548]

itertools.groupby()関数を使おうとしましたが、ビンサイズを指定する方法が見つかりません。

4

3 に答える 3

3

これは、itertoolsなしで行うのは簡単です

truc = [['12', 'brett', 5548],
       ['22.3', 'troy', 9514],
       ['8.1', 'hings', 12635],
       ['34.2', 'dab', 17666],
       ['4q3', 'sigma', 18065],
       ['4q3', 'delta', 18068]]

truc.sort(key=lambda a:a[-1])
groups = [[]]
last_row = None
for row in truc:
    if last_row is not None and row[-1] - last_row[-1] > 3500:
        groups.append([])
    last_row = row
    groups[-1].append(row)

import pprint
pprint.pprint(groups)

出力:

[[['12', 'brett', 5548]],
 [['22.3', 'troy', 9514], ['8.1', 'hings', 12635]],
 [['34.2', 'dab', 17666], ['4q3', 'sigma', 18065], ['4q3', 'delta', 18068]]]
于 2012-10-28T16:22:56.417 に答える
1

基本的なビナーgroupby

from itertools import groupby
from math import floor

# data must be sorted

data = [ ['12', 'brett', 5548],
       ['22.3', 'troy', 9514],
       ['8.1', 'hings', 12635],
       ['34.2', 'dab', 17666],
       ['4q3', 'sigma', 18065],
       ['4q3', 'delta', 18068] ]

groups = []
for k, g in groupby(data, lambda x: floor(x[-1]/3500)):
    groups.append(list(g))

print groups

戻り値:

[
    [
        ['12', 'brett', 5548]
    ],
    [
        ['22.3', 'troy', 9514]
    ],
    [
        ['8.1', 'hings', 12635]
    ],
    [
        ['34.2', 'dab', 17666],
        ['4q3', 'sigma', 18065],
        ['4q3', 'delta', 18068]
    ]
]

次に、1つのグループの最大値からグループの最小値を差し引いたものが3500未満であることが判明したときに、グループを合体させることができます。

[
    [
        ['12', 'brett', 5548]
    ],
    [
        ['22.3', 'troy', 9514],
        ['8.1', 'hings', 12635]
    ],
    [
        ['34.2', 'dab', 17666],
        ['4q3', 'sigma', 18065],
        ['4q3', 'delta', 18068]
    ]
]

の後に合体したとしてもgroupby、Anurag Uniyalのソリューションは、平均的なケースでより良いグループ化を実現すると思います。

于 2012-10-28T16:34:09.107 に答える
0

使用defaultdict()

lis=[['12', 'brett', 5548],
      ['22.3', 'troy', 9514],
      ['8.1', 'hings', 12635],
      ['34.2', 'dab', 17666],
      ['4q3', 'sigma', 18065],
      ['4q3', 'delta', 18068]]

from collections import defaultdict
d=defaultdict(list)
for i,x in enumerate(lis):
    not_append=True
    for y in d:
        for z in d[y]:
            if abs(z[-1]-x[-1])<=3500:
                d[y].append(x)
                not_append=False
                break
    else:
        if not_append:
            d[i].append(x)
print d.values()

出力:

[[['12', 'brett', 5548]],
 [['22.3', 'troy', 9514], ['8.1', 'hings', 12635]], 
 [['34.2', 'dab', 17666], ['4q3', 'sigma', 18065], ['4q3', 'delta', 18068]]
]
于 2012-10-28T17:24:19.393 に答える