3

Pythonを使用してタプルリストをネストされたリストに変換したいと思います。それ、どうやったら出来るの?

タプルのソートされたリストがあります(2番目の値でソートされています):

[(1, 5),  (5, 4), (13, 3), (4, 3), (3, 2), (14, 1), (12, 1), 
 (10, 1), (9, 1), (8, 1),  (7, 1), (6, 1), (2, 1)]

今、私はそれをこのようにしたい(2番目の値は無視され、リストにネストされている):

[ [1], [5], [13, 4], [3], [14, 12, 10, 9, 8, 7, 6, 2] ]

私はここでmapそのようなものに使用される他のスレッドを見ましたが、私はそれを完全には理解していません。誰かがこれを行うための「正しい」Pythonの方法に関する洞察を提供できますか?

4

5 に答える 5

11
from operator import itemgetter
from itertools import groupby

lst = [(1, 5),  (5, 4), (13, 3), (4, 3), (3, 2), (14, 1),
       (12, 1), (10, 1), (9, 1), (8, 1),  (7, 1), (6, 1), (2, 1)]

result = [[x for x, y in group]
          for key, group in groupby(lst, key=itemgetter(1))]

groupby(lst, key=itemgetter(1))lstすべての要素が同じ1番目(ゼロから数えて)の項目を持つ連続した要素のグループを生成します。は[x for x, y in group]、各グループ内の各要素の0番目の項目を保持します。

于 2009-12-06T14:16:01.320 に答える
2

少し複雑ですが、itertools.groupby関数を使用して実行できます。

>>> lst = [(1, 5),  (5, 4), (13, 3), (4, 3), (3, 2), (14, 1), (12, 1), 
 (10, 1), (9, 1), (8, 1),  (7, 1), (6, 1), (2, 1)]
>>> from operator import itemgetter 
>>> import itertools
>>> [map(itemgetter(0), group) for (key,group) in itertools.groupby(lst, itemgetter(1))]
[[1], [5], [13, 4], [3], [14, 12, 10, 9, 8, 7, 6, 2]]
>>> 

説明:groupbyは、各グループのイテレーターを返します。ここで、グループは、個別のパラメーターとして渡された関数によって返される同じ値を持つエントリーのシーケンスとして定義されます。itemgetter(1)は、引数xで呼び出されたときにx[1]を返す関数を生成します。groupbyイテレータは、使用されたキーとタプルである元の値のシーケンスの2つの値を返すため、各タプルの2番目の値を取り除く必要があります。これは、map(itemgetter(0)、group)が行うことです。

于 2009-12-06T14:16:16.807 に答える
1

おそらく最もpythonesqueな答えではありませんが、これは機能します:

d = {}

a = [(1,5), (5,4), (13,3), (4,3), (3,2), (14,1), (12,1)]

for value in a:
     if value[0] not in d:
         d[ value[0] ] = []
     d[ value[0] ].append( a[1] )

print d.values()
于 2009-12-06T14:17:18.277 に答える
1

簡単な解決策:

n_list = []
c_snd = None
for (fst, snd) in o_list:
  if snd == c_snd: n_list[-1].append(fst)
  else:
    c_snd = snd
    n_list.append([fst])

説明:c_sndタプルの現在の2番目の部分を保管するために使用します。それが変更された場合はn_list、この新しい2番目の値の新しいリストを開始します。それ以外の場合は、の最後のリストにfst追加します。fstn_list

于 2009-12-06T14:22:00.777 に答える
0

これが大きなセットでどれほど速くなるかはわかりませんが、次のようなことができます。

input = [
    (1,  5), (5,  4), (13, 3), (4, 3), (3, 2), (14, 1),
    (12, 1), (10, 1), (9,  1), (8, 1), (7, 1), (6,  1),
    (2,  1)
]

output = [[] for _ in xrange(input[0][1])]
for value, key in input:
    output[-key].append(value)

print output # => [[1], [5], [13, 4], [3], [14, 12, 10, 9, 8, 7, 6, 2]]
于 2009-12-06T14:13:44.987 に答える